{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "75df3b88-d555-43a1-a6e2-64c2c336e336",
   "metadata": {},
   "source": [
    "## Preprocessing and Illustration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4c58d159-af70-44c1-9e54-849e37a43b34",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Import necessary libraries\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "301eb1de-00a6-4603-b421-73653fcd14bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the datasets\n",
    "train_df = pd.read_csv(\"mitbih_train.csv\", header=None)\n",
    "test_df = pd.read_csv(\"mitbih_test.csv\", header=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "429706fa-dacc-4ca5-ba26-1c2bf7526e0e",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>178</th>\n",
       "      <th>179</th>\n",
       "      <th>180</th>\n",
       "      <th>181</th>\n",
       "      <th>182</th>\n",
       "      <th>183</th>\n",
       "      <th>184</th>\n",
       "      <th>185</th>\n",
       "      <th>186</th>\n",
       "      <th>187</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.977941</td>\n",
       "      <td>0.926471</td>\n",
       "      <td>0.681373</td>\n",
       "      <td>0.245098</td>\n",
       "      <td>0.154412</td>\n",
       "      <td>0.191176</td>\n",
       "      <td>0.151961</td>\n",
       "      <td>0.085784</td>\n",
       "      <td>0.058824</td>\n",
       "      <td>0.049020</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.960114</td>\n",
       "      <td>0.863248</td>\n",
       "      <td>0.461538</td>\n",
       "      <td>0.196581</td>\n",
       "      <td>0.094017</td>\n",
       "      <td>0.125356</td>\n",
       "      <td>0.099715</td>\n",
       "      <td>0.088319</td>\n",
       "      <td>0.074074</td>\n",
       "      <td>0.082621</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.659459</td>\n",
       "      <td>0.186486</td>\n",
       "      <td>0.070270</td>\n",
       "      <td>0.070270</td>\n",
       "      <td>0.059459</td>\n",
       "      <td>0.056757</td>\n",
       "      <td>0.043243</td>\n",
       "      <td>0.054054</td>\n",
       "      <td>0.045946</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.925414</td>\n",
       "      <td>0.665746</td>\n",
       "      <td>0.541436</td>\n",
       "      <td>0.276243</td>\n",
       "      <td>0.196133</td>\n",
       "      <td>0.077348</td>\n",
       "      <td>0.071823</td>\n",
       "      <td>0.060773</td>\n",
       "      <td>0.066298</td>\n",
       "      <td>0.058011</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.967136</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.830986</td>\n",
       "      <td>0.586854</td>\n",
       "      <td>0.356808</td>\n",
       "      <td>0.248826</td>\n",
       "      <td>0.145540</td>\n",
       "      <td>0.089202</td>\n",
       "      <td>0.117371</td>\n",
       "      <td>0.150235</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 188 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        0         1         2         3         4         5         6    \\\n",
       "0  0.977941  0.926471  0.681373  0.245098  0.154412  0.191176  0.151961   \n",
       "1  0.960114  0.863248  0.461538  0.196581  0.094017  0.125356  0.099715   \n",
       "2  1.000000  0.659459  0.186486  0.070270  0.070270  0.059459  0.056757   \n",
       "3  0.925414  0.665746  0.541436  0.276243  0.196133  0.077348  0.071823   \n",
       "4  0.967136  1.000000  0.830986  0.586854  0.356808  0.248826  0.145540   \n",
       "\n",
       "        7         8         9    ...  178  179  180  181  182  183  184  185  \\\n",
       "0  0.085784  0.058824  0.049020  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
       "1  0.088319  0.074074  0.082621  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
       "2  0.043243  0.054054  0.045946  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
       "3  0.060773  0.066298  0.058011  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
       "4  0.089202  0.117371  0.150235  ...  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   \n",
       "\n",
       "   186  187  \n",
       "0  0.0  0.0  \n",
       "1  0.0  0.0  \n",
       "2  0.0  0.0  \n",
       "3  0.0  0.0  \n",
       "4  0.0  0.0  \n",
       "\n",
       "[5 rows x 188 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a086f137-3a7d-4c04-89ef-d0f6f9a37460",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "187\n",
      "0    72471\n",
      "4     6431\n",
      "2     5788\n",
      "1     2223\n",
      "3      641\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "train_df[187]=train_df[187].astype(int)\n",
    "eq=train_df[187].value_counts()\n",
    "print(eq)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ec34e8f7-eea0-4955-addb-165a12746470",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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cOFCQ5KxdevWc9aEhoYanTp1Mp/PmDHD+Olf9//85z8NSUZubu4593H48GFDkjFjxowa287s74knnjjntp9q166dYbPZahwvNjbW8Pf3N0pLSz3Obc+ePR51a9euNSQZa9euNccGDx5stGvX7qy9V+971KhRhsPhMPbu3etRd8sttxjNmjUzjh075nGcW2+91aPuH//4hyHJ2Lhx41mPd0aPHj2MkJAQ4/jx4+bYqVOnjKioKKNNmzZGVVWVYRiGsWfPHkOSMWfOnPPuzzAM45prrjFcLtfP1p3LqVOnjJKSEsPX19d4/vnnzfH333+/xntqGIZRWlpqBAYGGkOGDPEYr6ysNK677jrjpptuMsduvPFGIzw83CgrKzPHjh8/bgQFBXl8BjIzMw1JxuzZsz32+d577xmSjFdffdUca9euneHl5WXs2rWrxrm0a9fOGD16tPl85syZxhVXXFHju3Dm871ixQrDMAxj7ty5hiTzzxkALjZcsggAlxjDMM67/frrr5fdbtf48eP1xhtv6Ntvv63Tce64445a11577bW67rrrPMYSEhJUXFysbdu21en4tbVmzRr1799f4eHhHuNjxozRiRMntHHjRo/xoUOHejzv2rWrJHlc9lddaWmpNm/erDvvvFPNmzc3x728vJSYmKj9+/fX+rLHX6KkpETTpk3TVVddpSZNmqhJkyZq3ry5SktLtXPnzp99/YYNG3T06FGNHj1ap06dMh9VVVUaNGiQtm7dqtLSUpWWlurzzz/XbbfdJrvdbr6+efPmNWbzzsxEVb/c8K677pKvr2+NSyG7du2qq6+++md7XbZsmaKionT99dd79BoXF+dxieuNN94oSRoxYoT+8Y9/6MCBAz+7bwD4NRHIAOASUlpaqiNHjigsLOycNVdeeaU+/vhjhYSE6KGHHtKVV16pK6+8Us8///wFHatVq1a1rnW5XOccO3LkyAUd90IdOXLkrL2eeY+qHz8oKMjj+ZnL6U6ePHnOYxQVFckwjAs6Tm20bdtWhw8f/tlLQs9ISEjQ/Pnz9cADD+ijjz7Sli1btHXrVrVs2fK8/Z9x5nLDO++8U97e3h6PWbNmyTAMHT161DzfMwvH/FT1sSNHjqhJkyY1Lnm12WxyuVw13pfafq4OHTqk7du31+jTz89PhmHohx9+kCT17t1bH3zwgU6dOqX77rtP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3nvvKTs7Ww8//LAk6fPPP1dSUpKeeuop7dq1S5mZmerdu/cve4MBAA3KZhiGYXUTAADU1ZYtWxQdHa2lS5fq9ttvr/Xr3n//ff3+97/XDz/8IOn0PWTJyckes1HffPONIiIitH//foWFhZnjAwYM0E033aS0tDSNGjVKJSUlWrZsmbn93nvv1bJly8x99erVS9dee61effVVs2bEiBEqLS3V8uXLJZ2eIUtOTtazzz5r1qxbt079+vVTUVGRWrRoofvuu08+Pj5asGCBWZOdna0+ffqotLRUK1as0O9+9zvt379ffn5+tX4vAADWYYYMANConfn/ijab7bx1a9euVWxsrFq3bi0/Pz/dd999OnLkiMflftVt27ZNhmHo6quvVvPmzc3H+vXr9c0330iSdu3apZtuusnjddWf79y5U7169fIY69Wrl3bu3Okx1r179/OeQ05OjhYtWuTRS1xcnKqqqrRnzx7FxsaqXbt26tixoxITE7V48WKdOHHivPsEAFiLRT0AAI1aRESEbDabdu7cqdtuu+2sNd9//71uvfVWPfjgg/q///f/KjAwUNnZ2Ro7dqwqKirOue+qqip5eXkpJydHXl5eHtuaN28u6XQgrB4Gz3bxydlqqo+d7ZLL6v1MmDBBSUlJNba1bdtWdrtd27Zt07p165SVlaUnnnhCqamp2rp160W3giQA4DRmyAAAjVpgYKDi4uL017/+9ayzXceOHdPnn3+uU6dO6ZlnnlGPHj109dVX6+DBgx51drtdlZWVHmM33HCDKisrVVhYqKuuusrjcWb1w2uuuUZbtmzxeN3nn3/u8bxTp07Kzs72GNuwYYM6dep0Qef6m9/8Rjt27KjRy1VXXSW73S5JatKkiQYMGKDZs2dr+/bt+u6777RmzZoLOg4A4NdDIAMANHovvfSSKisrddNNN2nJkiXavXu3du7cqRdeeEExMTG68sorderUKb344ov69ttv9dZbb+mVV17x2Ef79u1VUlKi1atX64cfftCJEyd09dVX65577tF9992npUuXas+ePdq6datmzZqlFStWSJImTZqkFStWaN68edq9e7cWLFiglStXesx+PfbYY1q0aJFeeeUV7d69W/PmzdPSpUvNhUNqa9q0adq4caMeeugh5ebmavfu3frwww81adIkSdKyZcv0wgsvKDc3V99//73efPNNVVVVKTIy8he+wwCABmMAAHAJOHjwoPHQQw8Z7dq1M+x2u9G6dWtj6NChxtq1aw3DMIx58+YZrVq1Mnx8fIy4uDjjzTffNCQZRUVF5j4efPBBIygoyJBkzJgxwzAMwygvLzeeeOIJo3379oa3t7fhcrmM22+/3di+fbv5uldffdVo3bq14ePjY9x2223G008/bbhcLo/+XnrpJaNjx46Gt7e3cfXVVxtvvvmmx3ZJRkZGhsfY2rVra/S4ZcsWIzY21mjevLnh6+trdO3a1fjzn/9sGIZhfPrpp0afPn2MgIAAw8fHx+jatavx3nvv/bI3FgDQoFhlEQCAejZu3Dh9/fXX+vTTT61uBQBwkWNRDwAAfqG5c+cqNjZWvr6+Wrlypd544w299NJLVrcFAGgEmCEDAOAXGjFihNatW6fjx4+rY8eOmjRpkh588EGr2wIANAIEMgAAAACwCKssAgAAAIBFCGQAAAAAYBECGQAAAABYhEAGAAAAABYhkAEAAACARQhkAAAAAGARAhkAAAAAWIRABgAAAAAW+f8Atkbn++oSGxAAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Labels for each category\n",
    "labels = ['n', 'q', 'v', 's', 'f']\n",
    "\n",
    "# Colors for each category\n",
    "colors = ['red', 'green', 'blue', 'skyblue', 'orange']\n",
    "\n",
    "# Creating the bar plot\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.bar(labels, eq, color=colors)\n",
    "\n",
    "# Adding labels and title\n",
    "plt.xlabel('Categories')\n",
    "plt.ylabel('Percentage')\n",
    "plt.title('Distribution of Categories')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "caf986c6-62cd-4e46-a9fc-9a9512e2df03",
   "metadata": {},
   "source": [
    "as we can see our data is heavily imbalenced, we have 3 ways to go now:\n",
    "1-Oversample:Replicate or generate new instances for the minority class to match the count of the majority class. Techniques like SMOTE (Synthetic Minority Over-sampling Technique) can be useful.\n",
    "2-Undersample:Randomly remove instances from the majority class to balance the class distribution. However, this may result in a loss of information.\n",
    "3-Weighted Loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "9e099c35-03e5-46d9-9429-227517c2b6de",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "#Oversampling the data, upsampling the classes 1-4\n",
    "from sklearn.utils import resample\n",
    "df_1=train_df[train_df[187]==1]\n",
    "df_2=train_df[train_df[187]==2]\n",
    "df_3=train_df[train_df[187]==3]\n",
    "df_4=train_df[train_df[187]==4]\n",
    "df_0=(train_df[train_df[187]==0]).sample(n=20000,random_state=42)\n",
    "\n",
    "df_1_upsample=resample(df_1,replace=True,n_samples=20000,random_state=123)\n",
    "df_2_upsample=resample(df_2,replace=True,n_samples=20000,random_state=124)\n",
    "df_3_upsample=resample(df_3,replace=True,n_samples=20000,random_state=125)\n",
    "df_4_upsample=resample(df_4,replace=True,n_samples=20000,random_state=126)\n",
    "\n",
    "train_df=pd.concat([df_0,df_1_upsample,df_2_upsample,df_3_upsample,df_4_upsample])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "da8823d3-d01f-4787-8236-e854b509c6ff",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "187\n",
      "0    20000\n",
      "1    20000\n",
      "2    20000\n",
      "3    20000\n",
      "4    20000\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "eq=train_df[187].value_counts()\n",
    "print(eq)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "4608e91a-5f25-472d-9da9-1d7b1825a0c6",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2QAAAIhCAYAAAAhCnmjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABTFUlEQVR4nO3de1hVdd7//9cO2YgIW5E4KeIhJRU001J08pAKmqe0MsNIy7C+mkbCaFaT2l06aWoHxzLH1BSzaZTqViPPFuP5QIoyjlOWmiCmCIIGiOv3R7fr1xYPSOASfD6ua18X+7Pee6332m53vvqs9cFmGIYhAAAAAMANd5vVDQAAAADArYpABgAAAAAWIZABAAAAgEUIZAAAAABgEQIZAAAAAFiEQAYAAAAAFiGQAQAAAIBFCGQAAAAAYBECGQAAAABYhEAGABXI/PnzZbPZzEfVqlXl7++vzp07a/LkycrMzCz2mgkTJshms13Xcc6ePasJEyZow4YN1/W6yx2rXr166tWr13Xt51oWL16st99++7LbbDabJkyYUKbHK2tr165V69at5eHhIZvNps8///yq9cePH9eLL76osLAwVa9eXVWrVlWjRo30/PPP6+DBg9d9/P3792vChAn68ccfS3cCFqhXr56GDBlidRsAUOaqWN0AAOD6zZs3T3feeacKCwuVmZmp5ORkvfnmm3rrrbf06aefqmvXrmbt008/re7du1/X/s+ePauJEydKkjp16lTi15XmWKWxePFipaamKjY2tti2zZs3q06dOuXeQ2kZhqEBAwaocePG+vLLL+Xh4aGQkJAr1m/btk29evWSYRh67rnnFB4eLrvdrgMHDmjRokW69957lZWVdV097N+/XxMnTlSnTp1Ur169P3hGN0ZiYqK8vLysbgMAyhyBDAAqoNDQULVu3dp8/tBDD+mFF17Qn/70J/Xv318HDx6Un5+fJKlOnTrlHlDOnj2ratWq3ZBjXUvbtm0tPf61HDt2TKdOnVK/fv3UpUuXq9bm5OSob9++qlq1qjZt2uT03nbq1EnPPPOM/vnPf5Z3y5Y6d+6c3N3d1bJlS6tbAYBywSWLAFBJ1K1bV9OmTdOZM2c0e/Zsc/xylxGuW7dOnTp1Uq1ateTu7q66devqoYce0tmzZ/Xjjz/q9ttvlyRNnDjRvDzy4uViF/e3a9cuPfzww6pZs6YaNmx4xWNdlJiYqObNm6tq1apq0KCB3n33XaftFy/HvPQyug0bNshms5mXT3bq1EkrVqzQTz/95HT55kWXu2QxNTVVffv2Vc2aNVW1alXdddddWrBgwWWP88knn+jll19WYGCgvLy81LVrVx04cODKb/zvJCcnq0uXLvL09FS1atXUrl07rVixwtw+YcIEM1SNHTtWNpvtqjNUc+bMUUZGhqZMmXLFoPvwww+bP+/YsUMDBw5UvXr15O7urnr16umxxx7TTz/9ZNbMnz9fjzzyiCSpc+fO5vs3f/58s2bNmjXq0qWLvLy8VK1aNbVv315r164tduwvvvhCzZs3l5ubmxo0aKB33nnnsp+BX3/9VePGjVP9+vVlt9tVu3ZtjRgxQqdPn3aqu3h567Jly9SyZUtVrVrVnKm93CWLOTk5io+Pd9pvbGys8vLynOo+++wztWnTRg6HQ9WqVVODBg301FNPXf5NB4AbjBkyAKhEHnjgAbm4uOibb765Ys2PP/6onj176r777tNHH32kGjVq6Oeff1ZSUpIKCgoUEBCgpKQkde/eXUOHDtXTTz8tSWZIu6h///4aOHCgnn322WL/AL5USkqKYmNjNWHCBPn7+yshIUHPP/+8CgoKFB8ff13nOGvWLA0bNkzff/+9EhMTr1l/4MABtWvXTr6+vnr33XdVq1YtLVq0SEOGDNHx48c1ZswYp/qXXnpJ7du319///nfl5ORo7Nix6t27t9LS0uTi4nLF42zcuFHdunVT8+bNNXfuXLm5uWnWrFnq3bu3PvnkEz366KN6+umn1aJFC/Xv318jR45UVFSU3NzcrrjPVatWycXFRb179y7Re/Pjjz8qJCREAwcOlLe3t9LT0/X+++/rnnvu0f79++Xj46OePXtq0qRJeumll/S3v/1Nd999tySZoXrRokV64okn1LdvXy1YsECurq6aPXu2IiMj9fXXX5uzeklJSerfv786dOigTz/9VOfPn9dbb72l48ePO/VkGIYefPBBrV27VuPGjdN9992nPXv2aPz48dq8ebM2b97s9B7s2rVLaWlpeuWVV1S/fn15eHhc9lzPnj2rjh076ujRo3rppZfUvHlz7du3T6+++qr27t2rNWvWyGazafPmzXr00Uf16KOPasKECapatap++uknrVu3rkTvKQCUOwMAUGHMmzfPkGRs3779ijV+fn5GkyZNzOfjx483fv91/89//tOQZKSkpFxxHydOnDAkGePHjy+27eL+Xn311Stu+73g4GDDZrMVO163bt0MLy8vIy8vz+ncDh065FS3fv16Q5Kxfv16c6xnz55GcHDwZXu/tO+BAwcabm5uxuHDh53qevToYVSrVs04ffq003EeeOABp7p//OMfhiRj8+bNlz3eRW3btjV8fX2NM2fOmGPnz583QkNDjTp16hgXLlwwDMMwDh06ZEgypk6detX9GYZh3HnnnYa/v/81667k/PnzRm5uruHh4WG888475vhnn31W7D01DMPIy8szvL29jd69ezuNFxUVGS1atDDuvfdec+yee+4xgoKCjPz8fHPszJkzRq1atZw+A0lJSYYkY8qUKU77/PTTTw1JxocffmiOBQcHGy4uLsaBAweKnUtwcLAxePBg8/nkyZON2267rdjfhYuf75UrVxqGYRhvvfWWIcn8cwaAmw2XLAJAJWMYxlW333XXXbLb7Ro2bJgWLFigH374oVTHeeihh0pc26xZM7Vo0cJpLCoqSjk5Odq1a1epjl9S69atU5cuXRQUFOQ0PmTIEJ09e1abN292Gu/Tp4/T8+bNm0uS02V/l8rLy9PWrVv18MMPq3r16ua4i4uLoqOjdfTo0RJf9vhH5ObmauzYsbrjjjtUpUoVValSRdWrV1deXp7S0tKu+fpNmzbp1KlTGjx4sM6fP28+Lly4oO7du2v79u3Ky8tTXl6eduzYoQcffFB2u918ffXq1YvN5l2cibr0csNHHnlEHh4exS6FbN68uRo3bnzNXpcvX67Q0FDdddddTr1GRkY6XeJ6zz33SJIGDBigf/zjH/r555+vuW8AuJEIZABQieTl5enkyZMKDAy8Yk3Dhg21Zs0a+fr6asSIEWrYsKEaNmyod95557qOFRAQUOJaf3//K46dPHnyuo57vU6ePHnZXi++R5cev1atWk7PL15Od+7cuSseIysrS4ZhXNdxSqJu3bo6ceLENS8JvSgqKkozZ87U008/ra+//lrbtm3T9u3bdfvtt1+1/4suXm748MMPy9XV1enx5ptvyjAMnTp1yjzfiwvH/N6lYydPnlSVKlWKXfJqs9nk7+9f7H0p6efq+PHj2rNnT7E+PT09ZRiGfvnlF0lShw4d9Pnnn+v8+fN64oknVKdOHYWGhuqTTz4p0XEAoLxxDxkAVCIrVqxQUVHRNZeqv++++3TfffepqKhIO3bs0HvvvafY2Fj5+flp4MCBJTrW9fxus4yMjCuOXQxAVatWlSTl5+c71V38h3Vp1apVS+np6cXGjx07Jkny8fH5Q/uXpJo1a+q2224r8+NERkZq1apV+t///d9r/rlkZ2dr+fLlGj9+vF588UVzPD8/X6dOnSrR8S72+N57711xtUo/Pz8VFhbKZrMVu19MKv5nXatWLZ0/f14nTpxwCmWGYSgjI8OcwbqopJ8rHx8fubu766OPPrrquUhS37591bdvX+Xn52vLli2aPHmyoqKiVK9ePYWHh5foeABQXpghA4BK4vDhw4qPj5fD4dAzzzxTote4uLioTZs2+tvf/iZJ5uWDJZkVuh779u3Td9995zS2ePFieXp6motKXFxtcM+ePU51X375ZbH9ubm5lbi3Ll26aN26dWYwuujjjz9WtWrVymSZfA8PD7Vp00bLli1z6uvChQtatGiR6tSpU6LL8C41dOhQ+fv7a8yYMVe81G7ZsmWSfgsyhmEUWyTk73//u4qKipzGrvTn2759e9WoUUP79+9X69atL/uw2+3y8PBQ69at9fnnn6ugoMB8fW5urpYvX+60z4uLgCxatMhpfOnSpcrLy7vm0v9X0qtXL33//feqVavWZfu83OqVbm5u6tixo958801J0u7du0t1bAAoS8yQAUAFlJqaat4zk5mZqW+//Vbz5s2Ti4uLEhMTi10e9nsffPCB1q1bp549e6pu3br69ddfzVmGi79Q2tPTU8HBwfriiy/UpUsXeXt7y8fHp9S/RDgwMFB9+vTRhAkTFBAQoEWLFmn16tV68803Va1aNUm/3esTEhKi+Ph4nT9/XjVr1lRiYqKSk5OL7S8sLEzLli3T+++/r1atWum2225z+r1svzd+/HgtX75cnTt31quvvipvb28lJCRoxYoVmjJlihwOR6nO6VKTJ09Wt27d1LlzZ8XHx8tut2vWrFlKTU3VJ598cl0zihc5HA598cUX6tWrl1q2bOn0i6EPHjyoRYsW6bvvvlP//v3l5eWlDh06aOrUqeaf1caNGzV37lzVqFHDab+hoaGSpA8//FCenp6qWrWq6tevr1q1aum9997T4MGDderUKT388MPy9fXViRMn9N133+nEiRN6//33JUmvvfaaevbsqcjI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qV+/fpo+fXqx2bb3339fDRs2lN1uV0hIiBYuXOi03Waz6YMPPlDfvn3l4eGh119//bKXLG7atEkdOnSQu7u7goKCNGrUKOXl5ZnbZ82apUaNGqlq1ary8/PTww8/XDZvMgCgXBDIAAAV2qlTp5SUlKQRI0bIw8Oj2PaLwei2227Tu+++q9TUVC1YsEDr1q3TmDFjJP12aeDbb78tLy8vpaenKz09XfHx8ZKkJ598Uv/617+0ZMkS7dmzR4888oi6d++ugwcPSpL+9a9/6dlnn9Xzzz+vlJQUdevWTW+88YZTD4mJiXr++ecVFxen1NRUPfPMM3ryySe1fv16p7rx48erb9++2rt3r5566qli57J3715FRkaqf//+2rNnjz799FMlJyfrueeekyTt2LFDo0aN0muvvaYDBw4oKSlJHTp0+GNvMACgXNkMwzCsbgIAgNLatm2b2rRpo2XLlqlfv34lft1nn32m//f//p9++eUXSb/dQxYbG+s0G/X999+rUaNGOnr0qAIDA83xrl276t5779WkSZM0cOBA5ebmavny5eb2xx9/XMuXLzf31b59ezVr1kwffvihWTNgwADl5eVpxYoVkn6bIYuNjdWMGTPMmg0bNqhz587KyspSjRo19MQTT8jd3V2zZ882a5KTk9WxY0fl5eVp5cqVevLJJ3X06FF5enqW+L0AAFiHGTIAQIV28f8r2my2q9atX79e3bp1U+3ateXp6aknnnhCJ0+edLrc71K7du2SYRhq3Lixqlevbj42btyo77//XpJ04MAB3XvvvU6vu/R5Wlqa2rdv7zTWvn17paWlOY21bt36quewc+dOzZ8/36mXyMhIXbhwQYcOHVK3bt0UHBysBg0aKDo6WgkJCTp79uxV9wkAsBaLegAAKrRGjRrJZrMpLS1NDz744GVrfvrpJz3wwAN69tln9T//8z/y9vZWcnKyhg4dqsLCwivu+8KFC3JxcdHOnTvl4uLitK169eqSfguEl4bBy118crmaS8cud8nlpf0888wzGjVqVLFtdevWld1u165du7RhwwatWrVKr776qiZMmKDt27ffdCtIAgB+wwwZAKBC8/b2VmRkpP72t79ddrbr9OnT2rFjh86fP69p06apbdu2aty4sY4dO+ZUZ7fbVVRU5DTWsmVLFRUVKTMzU3fccYfT4+Lqh3feeae2bdvm9LodO3Y4PW/SpImSk5OdxjZt2qQmTZpc17nefffd2rdvX7Fe7rjjDtntdklSlSpV1LVrV02ZMkV79uzRjz/+qHXr1l3XcQAANw6BDABQ4c2aNUtFRUW69957tXTpUh08eFBpaWl69913FR4eroYNG+r8+fN677339MMPP2jhwoX64IMPnPZRr1495ebmau3atfrll1909uxZNW7cWIMGDdITTzyhZcuW6dChQ9q+fbvefPNNrVy5UpI0cuRIrVy5UtOnT9fBgwc1e/ZsffXVV06zX3/+8581f/58ffDBBzp48KCmT5+uZcuWmQuHlNTYsWO1efNmjRgxQikpKTp48KC+/PJLjRw5UpK0fPlyvfvuu0pJSdFPP/2kjz/+WBcuXFBISMgffIcBAOXGAACgEjh27JgxYsQIIzg42LDb7Ubt2rWNPn36GOvXrzcMwzCmT59uBAQEGO7u7kZkZKTx8ccfG5KMrKwscx/PPvusUatWLUOSMX78eMMwDKOgoMB49dVXjXr16hmurq6Gv7+/0a9fP2PPnj3m6z788EOjdu3ahru7u/Hggw8ar7/+uuHv7+/U36xZs4wGDRoYrq6uRuPGjY2PP/7YabskIzEx0Wls/fr1xXrctm2b0a1bN6N69eqGh4eH0bx5c+ONN94wDMMwvv32W6Njx45GzZo1DXd3d6N58+bGp59++sfeWABAuWKVRQAAylhMTIz+/e9/69tvv7W6FQDATY5FPQAA+IPeeustdevWTR4eHvrqq6+0YMECzZo1y+q2AAAVADNkAAD8QQMGDNCGDRt05swZNWjQQCNHjtSzzz5rdVsAgAqAQAYAAAAAFmGVRQAAAACwCIEMAAAAACxCIAMAAAAAixDIAAAAAMAiBDIAAAAAsAiBDAAAAAAsQiADAAAAAIsQyAAAAADAIv8f5uiv6m+tdogAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Labels for each category\n",
    "labels = ['n', 'q', 'v', 's', 'f']\n",
    "\n",
    "# Colors for each category\n",
    "colors = ['red', 'green', 'blue', 'skyblue', 'orange']\n",
    "\n",
    "# Creating the bar plot\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.bar(labels, eq, color=colors)\n",
    "\n",
    "# Adding labels and title\n",
    "plt.xlabel('Categories')\n",
    "plt.ylabel('Percentage')\n",
    "plt.title('Distribution of Categories')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc45d7c1-d791-46fd-b7f9-b095007b0acf",
   "metadata": {},
   "source": [
    "now our data is balanced and we can continue"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6801278b-3d01-43a2-a180-360770ed4a9b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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FLRaLR588EGX+/bu3QuFQoFnn31Wus2bY1kcw5544gk8+eSTyM/PR2xsLMaOHYvffvtN2q6tc6jWPrvuvgtPnDiBv/zlL8jJyYFWq0VWVhYuvfRSlJaWSv8P7sZ9b8uUvT13be071ZMNGzZg5syZSE5Ohl6vR69evTBv3jyHbX755RdMmTIFcXFxiI6Oxrhx4/D11187bCP+jj/88AP++te/IiUlBcnJybj44otx8uRJabvWxpHWjjNvv8cAa7XtokWLUFBQAL1ej+TkZEyePBnr1q0D0Pr3t6f/ky+++AJjx45FdHQ04uLiMHXqVKxfv95hG2/PH7wR+ZevyCtxcXF44IEH8Pe//x3ff/89zjrrLLfbCYKAP/3pT1izZg0WLFiACRMmYMeOHVi4cCHWr1+P9evXO2RMfv/9d+zZswcPPPAA8vPzERMTI51g33fffZg8eTKWLVuGo0eP4s4778QVV1wBtVqNIUOG4IMPPsDWrVtx3333IS4uzmGgPnToEGbPni0F+9u3b8e//vUv7N27F2+88Ua73oOSkhJcfvnluPfee7Fo0SJ8/fXXePTRR1FVVYXnn38eAGCxWHDhhRdi7dq1uPvuuzFu3DgcO3YMCxcuxKRJk7B582Ypy3HgwAGcd955mDdvHmJiYrB37178+9//xsaNG/H9998DAB588EE0NDTg448/dvigsxyVfDF27Fi89tpruP3223HllVdi+PDh0Gg0fnnuG264AVOnTsX777+PoqIiPPDAA5g0aRJ27NiBxMREabvi4mJcddVVuPvuu/HYY49JAb43n4OrrroK99xzD5YtW4ZHH31Uek6z2Yx3330XM2fOREpKCgDg3XffxZw5c3DhhRfirbfegkajwcsvv4xzzjkHq1atkk6SRZdccglmzZqFG264ATt37sSCBQsAQBon1q9fj7POOguTJ0+WThTj4+MdnuP666/HjBkz8M4776ChocHje/v666/jxhtvxMSJE/HSSy8hLS0N+/fvx65du9r79juorKwEACxcuBAZGRmor6/HZ599hkmTJmHNmjUuAfyzzz6Lvn374oknnkB8fDz69OnT6vN/8cUX+OGHH7Bo0SLExMRg6dKl0ph86aWXOmzr7j157LHH8MADD+C6667DAw88gJaWFjz++OOYMGECNm7ciAEDBkiPNxqNuPjii3HzzTfjrrvuwvvvv48FCxagtrYWn3zyCe655x50794dzz33HK699loMHDgQI0aM8Pp9yMzMxMqVK3HuuefihhtukEpE21uF8Pnnn2Pt2rV46KGHkJGRgbS0NOzevRvjxo1Djx498J///AcZGRlYtWoVbr/9dpSXl2PhwoVtPq8373lJSQlGjRoFpVKJhx56CL169cL69evx6KOP4ujRo3jzzTel5zt69Chuuukm9OjRA4D1osVtt92GEydO4KGHHgIAfPbZZ7j00kuRkJCApUuXAkBAKh1CkRhQyo+DlpYWXHDBBbjppptw7733wmQy+fRdDwDbt2/HggULcP/99yMhIQGPPPIILr74YixYsABr1qzBY489BoVCgXvuuQfnn38+jhw5Ij3+6NGj6NevHy6//HIkJSWhuLgYL774Ik4//XTs3r0bKSkpmDFjBh577DHcd999eOGFF6Ry2F69erXrfViwYAHGjh2Ll156CUqlEmlpaT6PraLU1FScf/75eOutt/DII484XNx98803odVqpeoBX45lwBqY9u/fH08//TQA6znTeeedhyNHjiAhIcGrcyh3n113Tpw4gdNPPx1GoxH33XcfBg8ejIqKCqxatQpVVVVIT09v13st58u5q6fvVHdWrVqFmTNnoqCgAE8++SR69OiBo0eP4ttvv5W2+emnnzB16lQMHjwYr7/+OnQ6HZYuXYqZM2figw8+wKxZsxyec+7cuZgxY4b03X/XXXfhqquukr63vRlH3B1n4oWqtr7HTCYTpk+fjrVr12LevHk466yzYDKZ8Ntvv6GwsBDjxo3z6vtb7v3338eVV16JadOm4YMPPoDBYMCSJUuk1z7jjDMctm/r/MErAnVpb775pgBA2LRpk2AwGISePXsKI0eOFCwWiyAIgjBx4kThtNNOk7ZfuXKlAEBYsmSJw/MsX75cACC88sor0m25ubmCSqUS9u3b57DtDz/8IAAQZs6c6XD7vHnzBADC7bff7nD7n/70JyEpKcnj72A2mwWj0Si8/fbbgkqlEiorK6X7rrnmGiE3N7fN92HixIkCAOF///ufw+033nijoFQqhWPHjgmCIAgffPCBAED45JNPHLbbtGmTAEBYunSp2+e3WCyC0WgUfvrpJwGAsH37dum+W2+9VeBHkTqivLxcOOOMMwQAAgBBo9EI48aNExYvXizU1dU5bAtAWLhwoctz5ObmCtdcc430szg2XHTRRQ7b/frrrwIA4dFHH5VuEz8/a9asaXU/W/scXHzxxUL37t0Fs9ks3bZixQoBgPDll18KgiAIDQ0NQlJSksvYYTabhSFDhgijRo2Sblu4cKHbseqWW24R9Hq9NMYJgiDExMQ4/O7O78GcOXM83nfkyBFBEAShrq5OiI+PF8444wyH53Y2ceJEYeLEiS63uxurPP1fiUwmk2A0GoUpU6Y4/D8dOXJEACD06tVLaGlp8fh459eKiooSSkpKHJ6/f//+Qu/evaXbPL0nhYWFglqtFm677TaH2+vq6oSMjAzhsssuc/hdncdRo9EopKamCgCE33//Xbq9oqJCUKlUwvz5831+H06dOuXxPfT03SAeN3IAhISEBIfvFkEQhHPOOUfo3r27UFNT43D73/72N0Gv17ts78zb9/ymm24SYmNjpe8h0RNPPCEAEP744w+3zy9+Ny5atEhITk52OC5PO+00t8dhpBCP099++00wGo1CXV2d8NVXXwmpqalCXFyc9J6Lx+Ibb7zh8Hhfvutzc3OFqKgo4fjx49Jt27ZtEwAImZmZQkNDg3T7559/LgAQvvjiC4/7bjKZhPr6eiEmJkZ45plnpNs/+ugjAYDwww8/uDzGefwWOY834vnXmWee6bCdL2OrO1988YUAQPj2228dfo+srCzhkksukW7z9lgWx7BBgwYJJpNJ2m7jxo0CAOGDDz6QbmvtHMrTZ1e8Tz42XH/99YJGoxF2797t8fd0HvdF4vsq/79p6/yztXNXb79TRb169RJ69eolNDU1edxmzJgxQlpamsM5gclkEgYOHCh0795dGh/E3/GWW25xePySJUsEAEJxcbF0m6dxxNNx5o6n8fvtt98WAAivvvpqq4/39P3t/H9iNpuFrKwsYdCgQQ7nGXV1dUJaWpowbtw46TZfzh/awtJxkmi1Wjz66KPYvHkz/vvf/7rdRryS5Vyi9Oc//xkxMTEuJUaDBw9G37593T7X+eef7/BzQUEBAGuTIefbKysrHcrHt27digsuuADJyclQqVTQaDSYM2cOzGYz9u/f3/Yv60ZcXBwuuOACh9tmz54Ni8WCn3/+GQDw1VdfITExETNnzoTJZJL+DB06FBkZGQ4lKocPH8bs2bORkZEh7ePEiRMBAHv27GnXPhK5k5ycjLVr12LTpk34v//7P1x44YXYv38/FixYgEGDBjmUXfvKeR7juHHjkJub61KG3K1bN7eVMN5+Dq677jocP34c3333nXTbm2++iYyMDEyfPh0AsG7dOlRWVuKaa65x+PxZLBace+652LRpk0uTI+fP9ODBg9Hc3IyysjKv34NLLrmkzW3WrVuH2tpa3HLLLQGdq/zSSy9h+PDh0Ov1UKvV0Gg0WLNmjdsx5YILLvCpsmHKlCkOWRuVSoVZs2bh4MGDOH78uMO2zu/JqlWrYDKZMGfOHIf/G71ej4kTJ7qU7ykUCpx33nnSz2q1Gr1790ZmZiaGDRsm3Z6UlIS0tDSXVTF8eR/84ayzzkK3bt2kn5ubm7FmzRpcdNFFiI6OdvidzzvvPDQ3NzuUuHrizXv+1VdfYfLkycjKynJ4HfFz8dNPP0mP//7773H22WcjISFB+rw99NBDqKio8OmYjxRjxoyBRqNBXFwczj//fGRkZOCbb75xyU46H8++fNcDwNChQ5GdnS39LJ7PTJo0yWFerXi7/Hiur6/HPffcg969e0OtVkOtViM2NhYNDQ0BO56df9/2jK1y06dPR0ZGhkNGetWqVTh58qRDybMvxzJgPR9UqVTSz4MHDwYAt6vkeOL82fXkm2++weTJk6X/o0Dw5dzV03eqs/379+PQoUO44YYboNfr3W7T0NCADRs24NJLL0VsbKx0u0qlwtVXX43jx49j3759Do9x990J+Pbee/ru9Gb8/uabb6DX69ssmffWvn37cPLkSVx99dUO1QGxsbG45JJL8Ntvv6GxsdHhMf44f2DpODm4/PLL8cQTT+D+++/HxRdf7HJ/RUUF1Gq1S/mdQqFARkYGKioqHG5vrQQ6KSnJ4WetVtvq7c3NzYiNjUVhYSEmTJiAfv364ZlnnkFeXh70ej02btyIW2+9FU1NTd7/wjLuyoIyMjIAQPq9SktLUV1dLe2TMzGgqa+vx4QJE6DX6/Hoo4+ib9++iI6ORlFRES6++OJ27yNRa0aOHCk1/jEajbjnnnvw1FNPYcmSJe1uiiZ+Bpxv8+az7svnYPr06cjMzMSbb76JadOmoaqqCl988QX+/ve/Syda4jw55zJmucrKSsTExEg/JycnO9wvlrb58hn0ZiqHWA7XvXt3r5/XV08++ST+8Y9/4Oabb8Y///lPpKSkQKVS4cEHH3R7Qu7rFBRP/9eAdQyU/27Ozy3+35x++ulun9u57DE6OtrlpFCr1bqM/+Ltzc3N0s++vg/+4Pz7VlRUwGQy4bnnnsNzzz3n9jHeXODy5j0vLS3Fl19+6fGiifg6GzduxLRp0zBp0iS8+uqr0hzYzz//HP/617+65PfO22+/jYKCAqjVaqSnp7v9TERHR7uUm3r7XS9qz/mMaPbs2VizZg0efPBBnH766YiPj5cuRAXq/8zT59eXsVVOrVbj6quvxnPPPYfq6mokJiZi2bJlyMzMxDnnnOPwOt4cy6Jgjd+AdQwP5Pjt67mrL/sNtP7dU1VVBUEQ3D5nVlYWALh8pwfqvfd2/D516hSysrJaLZn3hfj7eXoPLBYLqqqqHC6M+eM9YKBNDhQKBf79739j6tSpeOWVV1zuT05OhslkwqlTpxyCbUEQUFJS4nKSFYjMzueff46GhgZ8+umnyM3NlW7ftm1bh55X/KKRKykpAWD/sIlNIVauXOn2OeLi4gBYswonT57Ejz/+KGXvALg0jCMKFI1Gg4ULF+Kpp55ymCOs0+mkxlVyzl+yIvEz4Hxb7969HW5z91n35XMgXll/9tlnUV1djffffx8GgwHXXXedtI04T/u5557z2E3UH/PonHkzjonjoXPm15ler3fbTMWboOzdd9/FpEmT8OKLLzrcXldX53Z7X8dfT//XgOsJh/Nzi/83H3/8scO4HAi+vg/u6PV6t58DT/8Pzr9vt27dpGP21ltvdfuY/Pz8NvfDm/c8JSUFgwcPxr/+9S+3zyGeKH/44YfQaDT46quvHC5i+Lp0XSQpKCiQLj564u5z4u13fUfV1NTgq6++wsKFC3HvvfdKtxsMBqkXgTdaO57Fz6acp89vR8bW6667Do8//jg+/PBDzJo1C1988QXmzZvnkJH29lj2J2/HwdTUVK/GbwAu77U347ev566+7DfQ+ndPt27doFQqUVxc7HKf2ODM3XHSUe5+B2/H79TUVPzyyy+wWCx+CbbF8dTTe6BUKr2qfPAVA21ycfbZZ2Pq1KlYtGgRcnJyHO6bMmUKlixZgnfffRd33HGHdPsnn3yChoYGj80y/En84MqbLgiCgFdffbVDz1tXV4cvvvjCoVTk/fffh1KpxJlnngnAWu7+4Ycfwmw2Y/To0T7tI2DtLutMfoWMy8VQexQXF7u9SiteHZafvOTl5WHHjh0O233//fcunf1F7733nkP517p163Ds2DGv1h/15XMAWE/UlixZgg8++ADLli3D2LFj0b9/f+n+8ePHIzExEbt378bf/va3Nl/fWzqdrsOZo3HjxiEhIQEvvfQSLr/8co8nSXl5efjoo49gMBik96WiogLr1q1rtYkLYH0/nd/LHTt2YP369S5jdXusWbMGpaWl0gm12WzG8uXL0atXrzYzPeeccw7UajUOHTrkVal9R3j7PrSWfcjLy0NZWZnD79vS0oJVq1Z5tQ/R0dGYPHkytm7disGDB3vMfLbFm/f8/PPPx4oVK9CrV69WTwTFpXPkgU1TUxPeeecdl239ccxHMm+/6ztKoVBAEASX4/m1115zWfGkrePZeVzfv38/9u3b51UA5Y+xtaCgAKNHj8abb74Js9nscqEU8P5Y9oW/zqGmT5+Od955B/v27UO/fv3cbiN21d6xY4fDNl988UWbzx+oc9e+ffuiV69eeOONNzB//ny3jQ1jYmIwevRofPrpp3jiiSek98liseDdd99F9+7dPU7zbE17xhFvx+/p06dL5wKtlY97uw/9+vVDdna2tJSx+P/R0NCATz75ROpE7m8MtMmtf//73xgxYgTKyspw2mmnSbdPnToV55xzDu655x7U1tZi/PjxUtfxYcOG4eqrrw74vk2dOhVarRZXXHEF7r77bjQ3N+PFF19EVVVVh543OTkZf/3rX1FYWIi+fftixYoVePXVV/HXv/5V6uB6+eWX47333sN5552Hv//97xg1ahQ0Gg2OHz+OH374ARdeeCEuuugijBs3Dt26dcPNN9+MhQsXQqPR4L333sP27dtdXnfQoEEArO/59OnToVKpOnTiRl3POeecg+7du2PmzJno378/LBYLtm3bhv/85z+IjY3F3//+d2nbq6++Gg8++CAeeughTJw4Ebt378bzzz+PhIQEt8+9efNmzJ07F3/+859RVFSE+++/H9nZ2bjlllva3C9fPgcA0L9/f4wdOxaLFy9GUVGRS1VNbGwsnnvuOVxzzTWorKzEpZdeKnUx3b59O06dOuVyldwbgwYNwo8//ogvv/wSmZmZiIuL83ii5UlsbCz+85//YO7cuTj77LNx4403Ij09HQcPHsT27dullQuuvvpqvPzyy7jqqqtw4403oqKiAkuWLGkzyAasJ6n//Oc/sXDhQkycOBH79u3DokWLkJ+f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4JZbbsE111zj9rMOHTq05dCIiIjIIeprtL2VwAH2MtG77rpL/r6+vh4PPfQQioqKkJCQgMzMTAwePBjvv/++fIy3kj6bzYYXX3wRvXv3hsFgQMeOHTFx4kQcP37c7bgrr7wSffv2xebNmzF8+HAkJSWhW7dueP7552Gz2Vp9HY2NjZg9ezaKioqg1+vRqVMn3HfffW7lZyqVCm+++SYaGhrkEnpfZdDTp0+H0WhEdXW1x8/Gjx+PnJwcmM1m+bbly5dj6NChMBqNSE5OxvXXX4/i4mK3+0nleAcOHMDo0aORnJyMgoICzJo1C01NTQDs5dnSB7Onn35aHqf0byGd423btuG2225DRkYGunfv7vP8A/Zs4NChQ5GcnIzk5GQMHDgQb731lvzz5v/WEn/KEQ8cOIC7774bPXr0QFJSEjp16oQbb7wRO3fudDtu7dq1UKlU+Mc//oFZs2ahU6dOMBgMOHDggM/Hfvrpp3HJJZcgMzMTqampuOiii/DWW29BCOF2nFTSvHLlSlx00UVITExE7969sWTJEo/H/P7773HZZZchISEB+fn5mD17ttu/Y0v8+feTnDlzBtOmTUOnTp2g1+vRrVs3PPHEEx7HqVQq3H///Vi8eDH69OkDg8GAd955Ry45Xb16NX73u98hKysLqampmDhxIurq6lBWVoZx48YhPT0deXl5eOihhzxeh7/nL1Cffvop+vfvj4SEBHTr1g1//etfPY6prq6W5wvp73H69Omoq6tzO+7111/HFVdcgY4dO8JoNKJfv3548cUX3V7LlVdeiS+++AJHjx51W/5CsUH623///ffxxBNPID8/H6mpqbj22mvx888/exy/cuVKXHPNNUhLS0NSUhL69OmDefPmtfgcy5cvx8iRI5GXl4fExET06dMHjz32mMfv26FDh3D77bcjPz8fBoMBOTk5uOaaa7B9+3b5mNWrV+PKK69EVlYWEhMT0aVLF9x6662or6+Xj3F935w7d658gfPRRx+FSqVC165dAXhflrJq1SrcdNNN6Ny5MxISEnDeeefh3nvv9VkifuzYMYwdOxapqalIS0vDr3/9a5w+fbrF8wHYl0k9++yz8ntvhw4dcPfdd/t1X8lPP/2Ea665BkajER06dMD999/vdh4A+8XBhQsXYuDAgUhMTERGRgZuu+02HDp0yO04f1733Llz8fDDDwMAioqK5L/1QJdRERERAW2U0bZarbBYLO5PHGAWcebMmfjHP/6BZ599FhdeeCHq6uqwa9cuVFZWtni/3//+9/jb3/6G+++/H2PGjMGRI0fwxz/+EWvXrsW2bduQnZ0tH1tWVoY777wTs2bNwpw5c/Dpp59i9uzZyM/Px8SJE30+hxACN998M77++mvMnj0bw4cPx48//og5c+Zg48aN2LhxIwwGAzZu3Ig//elPWLNmDVavXg0AcpDa3G9/+1u88sor+PDDDzFlyhT59nPnzuHf//437rvvPuh0OgDAc889hyeffBJ33303nnzySZhMJrz00ksYPnw4fvjhB5x//vny/c1mM375y19i8uTJmDVrFr755hv86U9/QlpaGp566ink5eVh5cqV+MUvfoHJkyfLz908KzJ27FjcfvvtmDp1qseHSVdPPfUU/vSnP2Hs2LGYNWsW0tLSsGvXLhw9etTnfQJx8uRJZGVl4fnnn0eHDh1w5swZvPPOO7jkkktQXFyMXr16uR0/e/ZsDB06FIsXL4ZarUbHjh19PvaRI0dw7733okuXLgDsQfIDDzyAEydO4KmnnnI7dseOHZg1axYee+wx5OTk4M0338TkyZNx3nnn4YorrgAA7N69G9dccw26du2KpUuXIikpCQsXLsR7773n9+tt7d8PsF/0ueqqq3Dw4EE8/fTT6N+/P9avX4958+Zh+/bt+OKLL9we87PPPsP69evx1FNPITc3Fx07dsTmzZsB2JcDjB07Fh988AGKi4vx+OOPw2Kx4Oeff8bYsWNxzz334KuvvsILL7yA/Px8zJw5M6jz56/t27dj+vTpmDt3LnJzc7Fs2TL84Q9/gMlkkvs+1NfXY8SIETh+/Dgef/xx9O/fHz/99BOeeuop7Ny5E1999ZUcKB88eBATJkyQA/IdO3bgz3/+M/bu3StfKFm4cCHuueceHDx4EJ9++mlQ46boe/zxx3HZZZfhzTffRHV1NR599FHceOON2LNnDzQaDQDgrbfewu9+9zuMGDECixcvRseOHbFv3z7s2rWrxcfev38/Ro8eLV8g3bt3L1544QX88MMP8lwPAKNHj4bVasWLL76ILl26oKKiAhs2bJAvyB45cgQ33HADhg8fjiVLliA9PR0nTpzAypUrYTKZkJSU5PHcU6ZMwYABAzB27Fg88MADmDBhAgwGg8+x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CbzyyitYv349Nm/ejNdffz2kMVJkSRdprVar159bLBavJc3N/0al8mrp3znY+aq2thbDhw/Hpk2b8Oyzz2Lt2rXYvHkzPvnkE7fHV6lU+Prrr3H99dfjxRdfxEUXXYQOHTrgwQcfRE1NDQD7UqKvvvoKHTt2xH333Yfu3buje/fueOWVVwIaky82mw0jR47EJ598gkceeQRff/01fvjhB3z//fduY3XV/G9Oq9UiKyurxfe1U6dO4dy5c9Dr9R5/h2VlZX5tGSY9j7exuP6tCyGQk5Pj8Tzff/+9/DzBvG4iIqJQRb3dssFg8GjQBMDjTdxoNOLpp5/G008/jVOnTsnZ7RtvvBF79+71+tjSm3RpaanHh6eTJ0+6rc8ORVZWFiwWC06fPu0WbAshUFZWhosvvjiox83IyMBNN92Ed999F88++yzefvttJCQk4I477pCPkV7DRx99JF+dbwv+ZHykc3H8+HEUFBT4PC4hIcHr70BFRUWr/0b//Oc/MXHiRDz33HMe9/W2NYu/maoPPvgAOp0O//3vf90C288++8yv+3uTlZWFsrIyj9u93RaKrKwsbNq0CUIIt9dbXl4Oi8XicU4j0dgrEucP8H6upNukv/fs7GwkJiZ6bUYn/VwaS11dHT755BO3vx3XxlTU/kgVISdOnHCrDgHsc25paWlQF3Nd56tArF69GidPnsTatWvlLDYAr/swFxYWyo0g9+3bhw8//BBz586FyWTC4sWLAQDDhw/H8OHDYbVasWXLFrz66quYPn06cnJycPvttwf8ulzt2rULO3bswNKlSzFp0iT59paaQpaVlaFTp07y9xaLBZWVlV4vLkqys7ORlZWFlStXev15SkpKq2P19jze/tZVKhXWr1/vdV26dFswr5uIiChUUe863rVrV/z4449ut61evRq1tbU+75OTk4O77roLd9xxB37++WePLqSSq6++GoA9GHO1efNm7Nmzx2MblGBJj9P8eT7++GPU1dWF9Dx33303Tp48iRUrVuCf//wnbrnlFrcA8vrrr4dWq8XBgwc9qgaCrR5onukJ1siRI6HRaLBo0aIWj/P2O7Bv3z6vHYGbU6lUHh+wvvjiC5w4cSLwATd7XK1WKzdJAuzn4x//+EfQj3nVVVfh66+/lqsQAHtWbvny5SGNtblrrrkGtbW1HkHtu+++K/880iJx/gB7F+IdO3a43fbee+8hJSUFF110EQB7ufvBgweRlZXl9e9B6sgsXWBw/f0RQuDvf/+7x/P6U9lCbePqq6+GSqXy+nezcuVKVFdX49prrw34cYcNG4a0tDQsXrw4oM743n6PAOCNN95o8X49e/bEk08+iX79+snLHlxpNBpccsklcoWFt2MCFcxYly1b5vb9hx9+CIvF0uKOEGPGjEFlZSWsVqvXv8HmTSr9fW6pcaT03GPGjIEQAidOnPD6PP369Qv4dYfr/Y+IiCjqGe3f/OY3+OMf/4innnoKI0aMwO7du/Haa68hLS3N7bhLLrkEY8aMQf/+/ZGRkYE9e/bgH//4B4YOHeq1EysA9OrVC/fccw9effVVqNVqjBo1Su46XlBQgBkzZoTlNVx33XW4/vrr8eijj6K6uhqXXXaZ3HX8wgsvxG9+85ugH3vkyJHo3Lkzpk2bhrKyMreyccAepD7zzDN44okncOjQIfziF79ARkYGTp06hR9++EGuBAhESkoKCgsL8e9//xvXXHMNMjMzkZ2dLQco/uratSsef/xx/OlPf0JDQwPuuOMOpKWlYffu3aioqJDH9Zvf/Aa//vWvMW3aNNx66604evQoXnzxRb/2fx0zZgyWLl2K3r17o3///ti6dSteeumlkMvVb7jhBsyfPx8TJkzAPffcg8rKSvzlL39psZtva5588kn85z//wdVXX42nnnoKSUlJeP3111vs2h6MiRMn4vXXX8ekSZNw5MgR9OvXD99++y2ee+45jB49OqggJFCROH+AfcnHL3/5S8ydOxd5eXn45z//iVWrVuGFF16Q54Hp06fj448/xhVXXIEZM2agf//+sNlsKCkpwf/+9z/MmjULl1xyCa677jro9XrccccdeOSRR9DY2IhFixbh7NmzHs/br18/fPLJJ1i0aBEGDRoEtVod1EUsCl337t1x//3346WXXsK5c+cwevRoJCYmYvPmzXj++ecxePBgeS1vIJKTk/Hyyy9jypQpuPbaa/G73/0OOTk5OHDgAHbs2IHXXnvN6/2GDRuGjIwMTJ06FXPmzIFOp8OyZcs8Lgj9+OOPuP/++/GrX/0KPXr0gF6vx+rVq/Hjjz/iscceAwAsXrwYq1evxg033IAuXbqgsbFRrswIx99t79690b17dzz22GMQQiAzMxOff/45Vq1a5fM+n3zyCbRaLa677jq56/iAAQMwbtw4n/e5/fbbsWzZMowePRp/+MMfMGTIEOh0Ohw/fhxr1qzBTTfdhFtuuaXFser1erz88suora3FxRdfLHcdHzVqFC6//HIAwGWXXYZ77rkHd999N7Zs2YIrrrgCRqMRpaWl+Pbbb9GvXz/8/ve/D+h1S8H5K6+8gkmTJkGn06FXr15+ZeGJiIjcRLLTmtTxtHn3X1dNTU3ikUceEQUFBSIxMVGMGDFCbN++3aMT9WOPPSYGDx4sMjIyhMFgEN26dRMzZswQFRUV8jHeusFarVbxwgsviJ49ewqdTieys7PFr3/9a3Hs2DG340aMGCEuuOACj/FNmjTJr27DDQ0N4tFHHxWFhYVCp9OJvLw88fvf/16cPXvW4/H87TouefzxxwUAUVBQIKxWq9djPvvsM3HVVVeJ1NRUYTAYRGFhobjtttvEV1991epzeztvX331lbjwwguFwWAQAOR/i5Y6/vrqxvvuu++Kiy++WCQkJIjk5GRx4YUXunUOt9ls4sUXXxTdunUTCQkJYvDgwWL16tV+dR0/e/asmDx5sujYsaNISkoSl19+uVi/fr3HfaXOw//617+8nj9vlixZInr16iX/vs2bN0+89dZbHh1pCwsLxQ033OBxf2/dtL/77jtx6aWXCoPBIHJzc8XDDz8s/va3v/ndddzff7/KykoxdepUkZeXJ7RarSgsLBSzZ88WjY2NbscBEPfdd5/HY/r62/X17+9tbP6ev0C6jt9www3io48+EhdccIHQ6/Wia9euHh3QhRCitrZWPPnkk6JXr15Cr9eLtLQ00a9fPzFjxgy3ru+ff/65GDBggEhISBCdOnUSDz/8sPi///s/AUCsWbNGPu7MmTPitttuE+np6UKlUrXYdZoiz2aziUWLFonBgweLpKQkodfrRY8ePcSjjz4qampq3I719bfvaxeDFStWiBEjRgij0SiSkpLE+eefL1544QX5597+3jZs2CCGDh0qkpKSRIcOHcSUKVPEtm3b3B7/1KlT4q677hK9e/cWRqNRJCcni/79+4v/9//+n7BYLEIIexftW265RRQWFgqDwSCysrLEiBEjxH/+8x+350MIXcd3794trrvuOpGSkiIyMjLEr371K1FSUuLxmNLr3Lp1q7jxxhtFcnKySElJEXfccYc4deqU2/N4+xs2m83iL3/5i/z3lZycLHr37i3uvfdesX//ftESaT758ccfxZVXXikSExNFZmam+P3vfy9qa2s9jl+yZIm45JJLhNFoFImJiaJ79+5i4sSJYsuWLQG/biGEmD17tsjPzxdqtdpjLiAiIvKXSogAauSIiIiIiIiIqEVRX6NNREREREREpCQMtImIiIiIiIjCiIE2ERERERERURgx0CYiIiIiIiIKIwbaRERERERERGHEQJuIiIiIiIgojLTRHoA/bDYbTp48iZSUFKhUqmgPh4hijBACNTU1yM/Ph1qtrOuLnB+JKFRKniOJiKIlJgLtkydPoqCgINrDIKIYd+zYMXTu3Dnawwgrzo9EFC5KnCOJiKIlJgLtlJQUAPY3gNTU1CiPhohiTXV1NQoKCuS5REk4PxJRqJQ8RxIRRUtMBNpSOWRqaio/SBJR0JRYWs35kYjCRYlzJBFRtHAhDhEREREREVEYMdAmIiIiIiIiCiMG2kRERERERERhxECbiIiIiIiIKIwYaBMRERERERGFEQNtIiIiIiIiojAKOND+5ptvcOONNyI/Px8qlQqfffZZq/dZt24dBg0ahISEBHTr1g2LFy8OZqxERO0a50ciIiIiAoIItOvq6jBgwAC89tprfh1/+PBhjB49GsOHD0dxcTEef/xxPPjgg/j4448DHiwRUXvG+ZGIiIiIAEAb6B1GjRqFUaNG+X384sWL0aVLFyxYsAAA0KdPH2zZsgV/+ctfcOuttwb69H6xWG1ostig16qh07A6nojaRizMj0TNCSGgUqmiPQwiIiJFiXgUunHjRowcOdLttuuvvx5btmyB2Wz2ep+mpiZUV1e7fQXiV29sxAVzvsSaveVBj5uIKNKiMT8SuXr+//bi4j9/jVPVjdEeChERkaJEPNAuKytDTk6O2205OTmwWCyoqKjwep958+YhLS1N/iooKAjoOfWOLLbJagtu0EREbSAa8yORq8XrDqKitgmvrzkQ7aEQEREpSpvUVTcvSRNCeL1dMnv2bFRVVclfx44dC+j5DDoNAKDJzECbiNq3tp4fibypbbJEewhERESKEvAa7UDl5uairKzM7bby8nJotVpkZWV5vY/BYIDBYAj6OZnRJqJYEI35kcibBpM12kMgIiJSlIhntIcOHYpVq1a53fa///0PgwcPhk6ni8hzGrT2l9Vk5gcHImq/ojE/EnlTz0CbiIgorAIO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r1q1CsOGDYvSqKKjqakJe/bsQV5eHoqKipCbm+t2XkwmE9atW6f48+LPax80aBB0Op3bMaWlpdi1a5fiz09lZSWOHTuGvLw8APF9LpSO86MT50c7zo8t4/xIREQhiVYXtkj54IMPhE6nE2+99ZbYvXu3mD59ujAajeLIkSPRHlpEzZo1S6xdu1YcOnRIfP/992LMmDEiJSVFft3PP/+8SEtLE5988onYuXOnuOOOO0ReXp6orq6O8shDV1NTI4qLi0VxcbEAIObPny+Ki4vF0aNHhRD+vfapU6eKzp07i6+++kps27ZNXH311WLAgAHCYrFE62UFpaVzUVNTI2bNmiU2bNggDh8+LNasWSOGDh0qOnXqpMhzQZ44P3J+5PzI+ZGIiNqG4gJtIYR4/fXXRWFhodDr9eKiiy4S69ati/aQIm78+PEiLy9P6HQ6kZ+fL8aOHSt++ukn+ec2m03MmTNH5ObmCoPBIK644gqxc+fOKI44fNasWSMAeHxNmjRJCOHfa29oaBD333+/yMzMFImJiWLMmDGipKQkCq8mNC2di/r6ejFy5EjRoUMHodPpRJcuXcSkSZM8XqdSzgV5x/mR8yPnR86PREQUeSohhGi7/DkRERERERGRsilqjTYRERERERFRtDHQJiIiIiIiIgojBtpEREREREREYcRAm4iIiIiIiCiMGGgTERERERERhREDbSIiIiIiIqIwYqBNREREREREFEYMtImIiIiIiIjCiIE2ERERERERURgx0CYiIiIiIiIKIwbaRERERERERGHEQJuIiIiIiIgojP4/PrevTLra3psAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x800 with 5 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#ploting the heartbeats. Each heartbeat is 188 long.\n",
    "# Extract rows for each heartbeat type\n",
    "heartbeat_0 = train_df[train_df[187] == 0].iloc[0, :186]\n",
    "heartbeat_1 = train_df[train_df[187] == 1].iloc[0, :186]\n",
    "heartbeat_2 = train_df[train_df[187] == 2].iloc[0, :186]\n",
    "heartbeat_3 = train_df[train_df[187] == 3].iloc[0, :186]\n",
    "heartbeat_4 = train_df[train_df[187] == 4].iloc[0, :186]\n",
    "\n",
    "# Plot each heartbeat type\n",
    "plt.figure(figsize=(12, 8))\n",
    "\n",
    "plt.subplot(2, 3, 1)\n",
    "plt.plot(heartbeat_0)\n",
    "plt.title(\"Normal beat\")\n",
    "\n",
    "plt.subplot(2, 3, 2)\n",
    "plt.plot(heartbeat_1)\n",
    "plt.title(\"Supraventricular premature beat\")\n",
    "\n",
    "plt.subplot(2, 3, 3)\n",
    "plt.plot(heartbeat_2)\n",
    "plt.title(\"Premature ventricular contraction\")\n",
    "\n",
    "plt.subplot(2, 3, 4)\n",
    "plt.plot(heartbeat_3)\n",
    "plt.title(\"Fusion of ventricular and normal beat\")\n",
    "\n",
    "plt.subplot(2, 3, 5)\n",
    "plt.plot(heartbeat_4)\n",
    "plt.title(\"Unclassifiable beat\")\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "bc082c6b-2d11-483a-9fd9-b7d558a5e836",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "# Extract features (X) and labels (y)\n",
    "X = train_df.iloc[:, :186]  # Features\n",
    "y = train_df[187]  # Labels\n",
    "\n",
    "# One-hot encode the categorical column\n",
    "y_encoded = pd.get_dummies(y, prefix='heartbeat_type')\n",
    "\n",
    "# Concatenate the one-hot encoded labels with the features\n",
    "df_encoded = pd.concat([X, y_encoded], axis=1)\n",
    "\n",
    "# Optionally, you can split the data into training and testing sets\n",
    "X_train, X_val, y_train, y_val = train_test_split(df_encoded.iloc[:, :186], df_encoded.iloc[:, 186:], test_size=0.2, random_state=42)\n",
    "\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "scaler = MinMaxScaler()\n",
    "X_train = scaler.fit_transform(X_train)\n",
    "X_val = scaler.transform(X_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "990e2a75-5905-4e9b-8d01-d0b5d8bc99d0",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Extract features (X) and labels (y)\n",
    "Xt = test_df.iloc[:, :186]  # Features\n",
    "yt = test_df[187]  # Labels\n",
    "\n",
    "# One-hot encode the categorical column\n",
    "yt_encoded = pd.get_dummies(yt, prefix='heartbeat_type')\n",
    "\n",
    "# Concatenate the one-hot encoded labels with the features\n",
    "test_encoded = pd.concat([Xt, yt_encoded], axis=1)\n",
    "\n",
    "X_test, y_test = test_encoded.iloc[:, :186], test_encoded.iloc[:, 186:]\n",
    "X_test = scaler.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "20526dc9-caa1-4ed6-ab88-afe12405ca32",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(80000, 186)\n",
      "(20000, 186)\n",
      "(80000, 5)\n",
      "(20000, 5)\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape)\n",
    "print(X_val.shape)\n",
    "print(y_train.shape)\n",
    "print(y_val.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1ec9e17-3c83-4542-9a51-684e3a5767d5",
   "metadata": {},
   "source": [
    "## CNN model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "9c1d72f0-a642-4c69-af72-4ed7ff196d35",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\Users\\Carrene\\anaconda3\\Lib\\site-packages\\keras\\src\\losses.py:2976: The name tf.losses.sparse_softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.sparse_softmax_cross_entropy instead.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from tensorflow.keras.models import Model\n",
    "from tensorflow.keras.layers import Input, Conv1D, Activation, Add, MaxPooling1D, Flatten, Dense, Softmax\n",
    "from tensorflow.keras.optimizers import Adam\n",
    "from tensorflow.keras.losses import CategoricalCrossentropy\n",
    "from tensorflow.keras.callbacks import LearningRateScheduler, ModelCheckpoint, EarlyStopping"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "86eaa2c4-11ba-47b0-8bc2-85fa10be4fc0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\Users\\Carrene\\anaconda3\\Lib\\site-packages\\keras\\src\\backend.py:1398: The name tf.executing_eagerly_outside_functions is deprecated. Please use tf.compat.v1.executing_eagerly_outside_functions instead.\n",
      "\n",
      "WARNING:tensorflow:From C:\\Users\\Carrene\\anaconda3\\Lib\\site-packages\\keras\\src\\backend.py:6642: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.\n",
      "\n",
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      " Layer (type)                Output Shape                 Param #   Connected to                  \n",
      "==================================================================================================\n",
      " input_1 (InputLayer)        [(None, 186, 1)]             0         []                            \n",
      "                                                                                                  \n",
      " conv1d (Conv1D)             (None, 182, 32)              192       ['input_1[0][0]']             \n",
      "                                                                                                  \n",
      " conv1d_1 (Conv1D)           (None, 182, 32)              5152      ['conv1d[0][0]']              \n",
      "                                                                                                  \n",
      " activation (Activation)     (None, 182, 32)              0         ['conv1d_1[0][0]']            \n",
      "                                                                                                  \n",
      " conv1d_2 (Conv1D)           (None, 182, 32)              5152      ['activation[0][0]']          \n",
      "                                                                                                  \n",
      " add (Add)                   (None, 182, 32)              0         ['conv1d_2[0][0]',            \n",
      "                                                                     'conv1d[0][0]']              \n",
      "                                                                                                  \n",
      " activation_3 (Activation)   (None, 182, 32)              0         ['add[0][0]']                 \n",
      "                                                                                                  \n",
      " max_pooling1d_1 (MaxPoolin  (None, 89, 32)               0         ['activation_3[0][0]']        \n",
      " g1D)                                                                                             \n",
      "                                                                                                  \n",
      " conv1d_5 (Conv1D)           (None, 89, 32)               5152      ['max_pooling1d_1[0][0]']     \n",
      "                                                                                                  \n",
      " activation_4 (Activation)   (None, 89, 32)               0         ['conv1d_5[0][0]']            \n",
      "                                                                                                  \n",
      " conv1d_6 (Conv1D)           (None, 89, 32)               5152      ['activation_4[0][0]']        \n",
      "                                                                                                  \n",
      " add_2 (Add)                 (None, 89, 32)               0         ['conv1d_6[0][0]',            \n",
      "                                                                     'max_pooling1d_1[0][0]']     \n",
      "                                                                                                  \n",
      " activation_5 (Activation)   (None, 89, 32)               0         ['add_2[0][0]']               \n",
      "                                                                                                  \n",
      " max_pooling1d_2 (MaxPoolin  (None, 43, 32)               0         ['activation_5[0][0]']        \n",
      " g1D)                                                                                             \n",
      "                                                                                                  \n",
      " conv1d_7 (Conv1D)           (None, 43, 32)               5152      ['max_pooling1d_2[0][0]']     \n",
      "                                                                                                  \n",
      " activation_6 (Activation)   (None, 43, 32)               0         ['conv1d_7[0][0]']            \n",
      "                                                                                                  \n",
      " conv1d_8 (Conv1D)           (None, 43, 32)               5152      ['activation_6[0][0]']        \n",
      "                                                                                                  \n",
      " add_3 (Add)                 (None, 43, 32)               0         ['conv1d_8[0][0]',            \n",
      "                                                                     'max_pooling1d_2[0][0]']     \n",
      "                                                                                                  \n",
      " activation_7 (Activation)   (None, 43, 32)               0         ['add_3[0][0]']               \n",
      "                                                                                                  \n",
      " max_pooling1d_3 (MaxPoolin  (None, 20, 32)               0         ['activation_7[0][0]']        \n",
      " g1D)                                                                                             \n",
      "                                                                                                  \n",
      " conv1d_9 (Conv1D)           (None, 20, 32)               5152      ['max_pooling1d_3[0][0]']     \n",
      "                                                                                                  \n",
      " activation_8 (Activation)   (None, 20, 32)               0         ['conv1d_9[0][0]']            \n",
      "                                                                                                  \n",
      " conv1d_10 (Conv1D)          (None, 20, 32)               5152      ['activation_8[0][0]']        \n",
      "                                                                                                  \n",
      " add_4 (Add)                 (None, 20, 32)               0         ['conv1d_10[0][0]',           \n",
      "                                                                     'max_pooling1d_3[0][0]']     \n",
      "                                                                                                  \n",
      " activation_9 (Activation)   (None, 20, 32)               0         ['add_4[0][0]']               \n",
      "                                                                                                  \n",
      " max_pooling1d_4 (MaxPoolin  (None, 8, 32)                0         ['activation_9[0][0]']        \n",
      " g1D)                                                                                             \n",
      "                                                                                                  \n",
      " flatten (Flatten)           (None, 256)                  0         ['max_pooling1d_4[0][0]']     \n",
      "                                                                                                  \n",
      " dense (Dense)               (None, 32)                   8224      ['flatten[0][0]']             \n",
      "                                                                                                  \n",
      " activation_10 (Activation)  (None, 32)                   0         ['dense[0][0]']               \n",
      "                                                                                                  \n",
      " dense_1 (Dense)             (None, 32)                   1056      ['activation_10[0][0]']       \n",
      "                                                                                                  \n",
      " dense_2 (Dense)             (None, 5)                    165       ['dense_1[0][0]']             \n",
      "                                                                                                  \n",
      " softmax (Softmax)           (None, 5)                    0         ['dense_2[0][0]']             \n",
      "                                                                                                  \n",
      "==================================================================================================\n",
      "Total params: 50853 (198.64 KB)\n",
      "Trainable params: 50853 (198.64 KB)\n",
      "Non-trainable params: 0 (0.00 Byte)\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "#Making the articles Model\n",
    "inp = Input(shape=(186, 1))\n",
    "C = Conv1D(filters=32, kernel_size=5, strides=1)(inp)\n",
    "\n",
    "C11 = Conv1D(filters=32, kernel_size=5, strides=1, padding='same')(C)\n",
    "A11 = Activation(\"relu\")(C11)\n",
    "C12 = Conv1D(filters=32, kernel_size=5, strides=1, padding='same')(A11)\n",
    "S11 = Add()([C12, C])\n",
    "A12 = Activation(\"relu\")(S11)\n",
    "M11 = MaxPooling1D(pool_size=5, strides=2)(A12)\n",
    "\n",
    "\n",
    "C21 = Conv1D(filters=32, kernel_size=5, strides=1, padding='same')(M11)\n",
    "A21 = Activation(\"relu\")(C21)\n",
    "C22 = Conv1D(filters=32, kernel_size=5, strides=1, padding='same')(A21)\n",
    "S21 = Add()([C22, M11])\n",
    "A22 = Activation(\"relu\")(S11)\n",
    "M21 = MaxPooling1D(pool_size=5, strides=2)(A22)\n",
    "\n",
    "\n",
    "C31 = Conv1D(filters=32, kernel_size=5, strides=1, padding='same')(M21)\n",
    "A31 = Activation(\"relu\")(C31)\n",
    "C32 = Conv1D(filters=32, kernel_size=5, strides=1, padding='same')(A31)\n",
    "S31 = Add()([C32, M21])\n",
    "A32 = Activation(\"relu\")(S31)\n",
    "M31 = MaxPooling1D(pool_size=5, strides=2)(A32)\n",
    "\n",
    "\n",
    "C41 = Conv1D(filters=32, kernel_size=5, strides=1, padding='same')(M31)\n",
    "A41 = Activation(\"relu\")(C41)\n",
    "C42 = Conv1D(filters=32, kernel_size=5, strides=1, padding='same')(A41)\n",
    "S41 = Add()([C42, M31])\n",
    "A42 = Activation(\"relu\")(S41)\n",
    "M41 = MaxPooling1D(pool_size=5, strides=2)(A42)\n",
    "\n",
    "\n",
    "C51 = Conv1D(filters=32, kernel_size=5, strides=1, padding='same')(M41)\n",
    "A51 = Activation(\"relu\")(C51)\n",
    "C52 = Conv1D(filters=32, kernel_size=5, strides=1, padding='same')(A51)\n",
    "S51 = Add()([C52, M41])\n",
    "A52 = Activation(\"relu\")(S51)\n",
    "M51 = MaxPooling1D(pool_size=5, strides=2)(A52)\n",
    "\n",
    "F1 = Flatten()(M51)\n",
    "\n",
    "D1 = Dense(32)(F1)\n",
    "A6 = Activation(\"relu\")(D1)\n",
    "D2 = Dense(32)(A6)\n",
    "D3 = Dense(5)(D2)\n",
    "A7 = Softmax()(D3)\n",
    "\n",
    "model = Model(inputs=inp, outputs=A7)\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "6f24183e-8451-45b3-83e5-c1b1dcba81ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      " Layer (type)                Output Shape                 Param #   Connected to                  \n",
      "==================================================================================================\n",
      " input_1 (InputLayer)        [(None, 186, 1)]             0         []                            \n",
      "                                                                                                  \n",
      " conv1d (Conv1D)             (None, 182, 32)              192       ['input_1[0][0]']             \n",
      "                                                                                                  \n",
      " conv1d_1 (Conv1D)           (None, 182, 32)              5152      ['conv1d[0][0]']              \n",
      "                                                                                                  \n",
      " activation (Activation)     (None, 182, 32)              0         ['conv1d_1[0][0]']            \n",
      "                                                                                                  \n",
      " conv1d_2 (Conv1D)           (None, 182, 32)              5152      ['activation[0][0]']          \n",
      "                                                                                                  \n",
      " add (Add)                   (None, 182, 32)              0         ['conv1d_2[0][0]',            \n",
      "                                                                     'conv1d[0][0]']              \n",
      "                                                                                                  \n",
      " activation_3 (Activation)   (None, 182, 32)              0         ['add[0][0]']                 \n",
      "                                                                                                  \n",
      " max_pooling1d_1 (MaxPoolin  (None, 89, 32)               0         ['activation_3[0][0]']        \n",
      " g1D)                                                                                             \n",
      "                                                                                                  \n",
      " conv1d_5 (Conv1D)           (None, 89, 32)               5152      ['max_pooling1d_1[0][0]']     \n",
      "                                                                                                  \n",
      " activation_4 (Activation)   (None, 89, 32)               0         ['conv1d_5[0][0]']            \n",
      "                                                                                                  \n",
      " conv1d_6 (Conv1D)           (None, 89, 32)               5152      ['activation_4[0][0]']        \n",
      "                                                                                                  \n",
      " add_2 (Add)                 (None, 89, 32)               0         ['conv1d_6[0][0]',            \n",
      "                                                                     'max_pooling1d_1[0][0]']     \n",
      "                                                                                                  \n",
      " activation_5 (Activation)   (None, 89, 32)               0         ['add_2[0][0]']               \n",
      "                                                                                                  \n",
      " max_pooling1d_2 (MaxPoolin  (None, 43, 32)               0         ['activation_5[0][0]']        \n",
      " g1D)                                                                                             \n",
      "                                                                                                  \n",
      " conv1d_7 (Conv1D)           (None, 43, 32)               5152      ['max_pooling1d_2[0][0]']     \n",
      "                                                                                                  \n",
      " activation_6 (Activation)   (None, 43, 32)               0         ['conv1d_7[0][0]']            \n",
      "                                                                                                  \n",
      " conv1d_8 (Conv1D)           (None, 43, 32)               5152      ['activation_6[0][0]']        \n",
      "                                                                                                  \n",
      " add_3 (Add)                 (None, 43, 32)               0         ['conv1d_8[0][0]',            \n",
      "                                                                     'max_pooling1d_2[0][0]']     \n",
      "                                                                                                  \n",
      " activation_7 (Activation)   (None, 43, 32)               0         ['add_3[0][0]']               \n",
      "                                                                                                  \n",
      " max_pooling1d_3 (MaxPoolin  (None, 20, 32)               0         ['activation_7[0][0]']        \n",
      " g1D)                                                                                             \n",
      "                                                                                                  \n",
      " conv1d_9 (Conv1D)           (None, 20, 32)               5152      ['max_pooling1d_3[0][0]']     \n",
      "                                                                                                  \n",
      " activation_8 (Activation)   (None, 20, 32)               0         ['conv1d_9[0][0]']            \n",
      "                                                                                                  \n",
      " conv1d_10 (Conv1D)          (None, 20, 32)               5152      ['activation_8[0][0]']        \n",
      "                                                                                                  \n",
      " add_4 (Add)                 (None, 20, 32)               0         ['conv1d_10[0][0]',           \n",
      "                                                                     'max_pooling1d_3[0][0]']     \n",
      "                                                                                                  \n",
      " activation_9 (Activation)   (None, 20, 32)               0         ['add_4[0][0]']               \n",
      "                                                                                                  \n",
      " max_pooling1d_4 (MaxPoolin  (None, 8, 32)                0         ['activation_9[0][0]']        \n",
      " g1D)                                                                                             \n",
      "                                                                                                  \n",
      " flatten (Flatten)           (None, 256)                  0         ['max_pooling1d_4[0][0]']     \n",
      "                                                                                                  \n",
      " dense (Dense)               (None, 32)                   8224      ['flatten[0][0]']             \n",
      "                                                                                                  \n",
      " activation_10 (Activation)  (None, 32)                   0         ['dense[0][0]']               \n",
      "                                                                                                  \n",
      " dense_1 (Dense)             (None, 32)                   1056      ['activation_10[0][0]']       \n",
      "                                                                                                  \n",
      " dense_2 (Dense)             (None, 5)                    165       ['dense_1[0][0]']             \n",
      "                                                                                                  \n",
      " softmax (Softmax)           (None, 5)                    0         ['dense_2[0][0]']             \n",
      "                                                                                                  \n",
      "==================================================================================================\n",
      "Total params: 50853 (198.64 KB)\n",
      "Trainable params: 50853 (198.64 KB)\n",
      "Non-trainable params: 0 (0.00 Byte)\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "# Compile the model\n",
    "model.compile(optimizer=Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999),\n",
    "              loss=CategoricalCrossentropy(),\n",
    "              metrics=['accuracy'])\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "c355419f-edf1-4746-af06-bfe270061dd8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Learning rate scheduler\n",
    "def lr_scheduler(epoch, lr):\n",
    "    decay_factor = 0.75\n",
    "    decay_period = 25 #changed this from 10000\n",
    "    if epoch % decay_period == 0 and epoch != 0:\n",
    "        return lr * decay_factor\n",
    "    return lr\n",
    "\n",
    "lr_callback = LearningRateScheduler(lr_scheduler, verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "e3ea3ec6-2438-48f6-a78a-818610eb3b3c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Model checkpoint\n",
    "model_checkpoint = ModelCheckpoint('best_model.h5', save_best_only=True, monitor='val_loss', mode='min', verbose=1)\n",
    "# Early stopping\n",
    "early_stopping = EarlyStopping(monitor='val_loss', patience=50, restore_best_weights=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "aadd1525-3bc0-4f23-8c23-14045ce9c127",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Epoch 1: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 1/200\n",
      "WARNING:tensorflow:From C:\\Users\\Carrene\\anaconda3\\Lib\\site-packages\\keras\\src\\utils\\tf_utils.py:492: The name tf.ragged.RaggedTensorValue is deprecated. Please use tf.compat.v1.ragged.RaggedTensorValue instead.\n",
      "\n",
      "WARNING:tensorflow:From C:\\Users\\Carrene\\anaconda3\\Lib\\site-packages\\keras\\src\\engine\\base_layer_utils.py:384: The name tf.executing_eagerly_outside_functions is deprecated. Please use tf.compat.v1.executing_eagerly_outside_functions instead.\n",
      "\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.3061 - accuracy: 0.8885\n",
      "Epoch 1: val_loss improved from inf to 0.22074, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 30s 11ms/step - loss: 0.3061 - accuracy: 0.8885 - val_loss: 0.2207 - val_accuracy: 0.9188 - lr: 0.0010\n",
      "\n",
      "Epoch 2: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 2/200\n",
      "   6/2500 [..............................] - ETA: 28s - loss: 0.2848 - accuracy: 0.9062"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Carrene\\anaconda3\\Lib\\site-packages\\keras\\src\\engine\\training.py:3103: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.\n",
      "  saving_api.save_model(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2500/2500 [==============================] - ETA: 0s - loss: 0.1305 - accuracy: 0.9536\n",
      "Epoch 2: val_loss improved from 0.22074 to 0.11527, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 27s 11ms/step - loss: 0.1305 - accuracy: 0.9536 - val_loss: 0.1153 - val_accuracy: 0.9607 - lr: 0.0010\n",
      "\n",
      "Epoch 3: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 3/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0900 - accuracy: 0.9690\n",
      "Epoch 3: val_loss improved from 0.11527 to 0.07208, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 27s 11ms/step - loss: 0.0899 - accuracy: 0.9690 - val_loss: 0.0721 - val_accuracy: 0.9781 - lr: 0.0010\n",
      "\n",
      "Epoch 4: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 4/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0690 - accuracy: 0.9765\n",
      "Epoch 4: val_loss improved from 0.07208 to 0.07146, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 27s 11ms/step - loss: 0.0690 - accuracy: 0.9765 - val_loss: 0.0715 - val_accuracy: 0.9769 - lr: 0.0010\n",
      "\n",
      "Epoch 5: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 5/200\n",
      "2495/2500 [============================>.] - ETA: 0s - loss: 0.0608 - accuracy: 0.9796\n",
      "Epoch 5: val_loss did not improve from 0.07146\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0608 - accuracy: 0.9796 - val_loss: 0.0791 - val_accuracy: 0.9741 - lr: 0.0010\n",
      "\n",
      "Epoch 6: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 6/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0522 - accuracy: 0.9822\n",
      "Epoch 6: val_loss did not improve from 0.07146\n",
      "2500/2500 [==============================] - 27s 11ms/step - loss: 0.0521 - accuracy: 0.9822 - val_loss: 0.0719 - val_accuracy: 0.9781 - lr: 0.0010\n",
      "\n",
      "Epoch 7: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 7/200\n",
      "2495/2500 [============================>.] - ETA: 0s - loss: 0.0462 - accuracy: 0.9846\n",
      "Epoch 7: val_loss improved from 0.07146 to 0.07020, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0461 - accuracy: 0.9846 - val_loss: 0.0702 - val_accuracy: 0.9787 - lr: 0.0010\n",
      "\n",
      "Epoch 8: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 8/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0453 - accuracy: 0.9853\n",
      "Epoch 8: val_loss improved from 0.07020 to 0.04772, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0453 - accuracy: 0.9853 - val_loss: 0.0477 - val_accuracy: 0.9851 - lr: 0.0010\n",
      "\n",
      "Epoch 9: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 9/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0420 - accuracy: 0.9861\n",
      "Epoch 9: val_loss improved from 0.04772 to 0.04264, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0420 - accuracy: 0.9862 - val_loss: 0.0426 - val_accuracy: 0.9876 - lr: 0.0010\n",
      "\n",
      "Epoch 10: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 10/200\n",
      "2495/2500 [============================>.] - ETA: 0s - loss: 0.0368 - accuracy: 0.9881\n",
      "Epoch 10: val_loss improved from 0.04264 to 0.03614, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0369 - accuracy: 0.9881 - val_loss: 0.0361 - val_accuracy: 0.9892 - lr: 0.0010\n",
      "\n",
      "Epoch 11: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 11/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0346 - accuracy: 0.9890\n",
      "Epoch 11: val_loss did not improve from 0.03614\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0346 - accuracy: 0.9890 - val_loss: 0.0381 - val_accuracy: 0.9894 - lr: 0.0010\n",
      "\n",
      "Epoch 12: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 12/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0349 - accuracy: 0.9886\n",
      "Epoch 12: val_loss did not improve from 0.03614\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0349 - accuracy: 0.9886 - val_loss: 0.0461 - val_accuracy: 0.9857 - lr: 0.0010\n",
      "\n",
      "Epoch 13: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 13/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0329 - accuracy: 0.9897\n",
      "Epoch 13: val_loss did not improve from 0.03614\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0329 - accuracy: 0.9897 - val_loss: 0.0368 - val_accuracy: 0.9885 - lr: 0.0010\n",
      "\n",
      "Epoch 14: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 14/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0323 - accuracy: 0.9893\n",
      "Epoch 14: val_loss did not improve from 0.03614\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0323 - accuracy: 0.9893 - val_loss: 0.0393 - val_accuracy: 0.9879 - lr: 0.0010\n",
      "\n",
      "Epoch 15: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 15/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0301 - accuracy: 0.9905\n",
      "Epoch 15: val_loss did not improve from 0.03614\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0301 - accuracy: 0.9905 - val_loss: 0.0392 - val_accuracy: 0.9894 - lr: 0.0010\n",
      "\n",
      "Epoch 16: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 16/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0290 - accuracy: 0.9906\n",
      "Epoch 16: val_loss improved from 0.03614 to 0.03454, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0290 - accuracy: 0.9906 - val_loss: 0.0345 - val_accuracy: 0.9892 - lr: 0.0010\n",
      "\n",
      "Epoch 17: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 17/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0266 - accuracy: 0.9910\n",
      "Epoch 17: val_loss did not improve from 0.03454\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0266 - accuracy: 0.9910 - val_loss: 0.0507 - val_accuracy: 0.9844 - lr: 0.0010\n",
      "\n",
      "Epoch 18: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 18/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0252 - accuracy: 0.9922\n",
      "Epoch 18: val_loss did not improve from 0.03454\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0252 - accuracy: 0.9922 - val_loss: 0.0384 - val_accuracy: 0.9888 - lr: 0.0010\n",
      "\n",
      "Epoch 19: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 19/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0270 - accuracy: 0.9913\n",
      "Epoch 19: val_loss did not improve from 0.03454\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0269 - accuracy: 0.9913 - val_loss: 0.0358 - val_accuracy: 0.9901 - lr: 0.0010\n",
      "\n",
      "Epoch 20: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 20/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0256 - accuracy: 0.9916\n",
      "Epoch 20: val_loss did not improve from 0.03454\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0256 - accuracy: 0.9916 - val_loss: 0.0453 - val_accuracy: 0.9862 - lr: 0.0010\n",
      "\n",
      "Epoch 21: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 21/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0249 - accuracy: 0.9919\n",
      "Epoch 21: val_loss did not improve from 0.03454\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0249 - accuracy: 0.9919 - val_loss: 0.0378 - val_accuracy: 0.9890 - lr: 0.0010\n",
      "\n",
      "Epoch 22: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 22/200\n",
      "2495/2500 [============================>.] - ETA: 0s - loss: 0.0235 - accuracy: 0.9922\n",
      "Epoch 22: val_loss did not improve from 0.03454\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0235 - accuracy: 0.9922 - val_loss: 0.0479 - val_accuracy: 0.9874 - lr: 0.0010\n",
      "\n",
      "Epoch 23: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 23/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0250 - accuracy: 0.9925\n",
      "Epoch 23: val_loss did not improve from 0.03454\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0250 - accuracy: 0.9925 - val_loss: 0.0471 - val_accuracy: 0.9872 - lr: 0.0010\n",
      "\n",
      "Epoch 24: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 24/200\n",
      "2495/2500 [============================>.] - ETA: 0s - loss: 0.0213 - accuracy: 0.9936\n",
      "Epoch 24: val_loss did not improve from 0.03454\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0212 - accuracy: 0.9936 - val_loss: 0.0398 - val_accuracy: 0.9896 - lr: 0.0010\n",
      "\n",
      "Epoch 25: LearningRateScheduler setting learning rate to 0.0010000000474974513.\n",
      "Epoch 25/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0233 - accuracy: 0.9928\n",
      "Epoch 25: val_loss did not improve from 0.03454\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0233 - accuracy: 0.9928 - val_loss: 0.0440 - val_accuracy: 0.9872 - lr: 0.0010\n",
      "\n",
      "Epoch 26: LearningRateScheduler setting learning rate to 0.0007500000356230885.\n",
      "Epoch 26/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0139 - accuracy: 0.9959\n",
      "Epoch 26: val_loss improved from 0.03454 to 0.03266, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0139 - accuracy: 0.9959 - val_loss: 0.0327 - val_accuracy: 0.9921 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 27: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 27/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0124 - accuracy: 0.9960\n",
      "Epoch 27: val_loss improved from 0.03266 to 0.03208, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0124 - accuracy: 0.9960 - val_loss: 0.0321 - val_accuracy: 0.9915 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 28: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 28/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0131 - accuracy: 0.9959\n",
      "Epoch 28: val_loss improved from 0.03208 to 0.02519, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0130 - accuracy: 0.9959 - val_loss: 0.0252 - val_accuracy: 0.9938 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 29: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 29/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0131 - accuracy: 0.9959\n",
      "Epoch 29: val_loss did not improve from 0.02519\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0131 - accuracy: 0.9959 - val_loss: 0.0344 - val_accuracy: 0.9908 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 30: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 30/200\n",
      "2495/2500 [============================>.] - ETA: 0s - loss: 0.0113 - accuracy: 0.9965\n",
      "Epoch 30: val_loss did not improve from 0.02519\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0113 - accuracy: 0.9965 - val_loss: 0.0268 - val_accuracy: 0.9929 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 31: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 31/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0116 - accuracy: 0.9966\n",
      "Epoch 31: val_loss did not improve from 0.02519\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0116 - accuracy: 0.9966 - val_loss: 0.0466 - val_accuracy: 0.9894 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 32: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 32/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0121 - accuracy: 0.9962\n",
      "Epoch 32: val_loss did not improve from 0.02519\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0121 - accuracy: 0.9962 - val_loss: 0.0253 - val_accuracy: 0.9942 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 33: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 33/200\n",
      "2495/2500 [============================>.] - ETA: 0s - loss: 0.0115 - accuracy: 0.9965\n",
      "Epoch 33: val_loss did not improve from 0.02519\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0116 - accuracy: 0.9965 - val_loss: 0.0406 - val_accuracy: 0.9902 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 34: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 34/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0123 - accuracy: 0.9961\n",
      "Epoch 34: val_loss did not improve from 0.02519\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0123 - accuracy: 0.9961 - val_loss: 0.0265 - val_accuracy: 0.9942 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 35: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 35/200\n",
      "2495/2500 [============================>.] - ETA: 0s - loss: 0.0111 - accuracy: 0.9966\n",
      "Epoch 35: val_loss did not improve from 0.02519\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0111 - accuracy: 0.9966 - val_loss: 0.0393 - val_accuracy: 0.9914 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 36: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 36/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0111 - accuracy: 0.9965\n",
      "Epoch 36: val_loss did not improve from 0.02519\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0111 - accuracy: 0.9965 - val_loss: 0.0374 - val_accuracy: 0.9912 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 37: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 37/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0107 - accuracy: 0.9968\n",
      "Epoch 37: val_loss improved from 0.02519 to 0.02426, saving model to best_model.h5\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0107 - accuracy: 0.9968 - val_loss: 0.0243 - val_accuracy: 0.9946 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 38: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 38/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0098 - accuracy: 0.9969\n",
      "Epoch 38: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0098 - accuracy: 0.9969 - val_loss: 0.0245 - val_accuracy: 0.9948 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 39: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 39/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0090 - accuracy: 0.9972\n",
      "Epoch 39: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0090 - accuracy: 0.9972 - val_loss: 0.0278 - val_accuracy: 0.9949 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 40: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 40/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0113 - accuracy: 0.9968\n",
      "Epoch 40: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0113 - accuracy: 0.9968 - val_loss: 0.0388 - val_accuracy: 0.9914 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 41: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 41/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0095 - accuracy: 0.9970\n",
      "Epoch 41: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 12ms/step - loss: 0.0095 - accuracy: 0.9970 - val_loss: 0.0330 - val_accuracy: 0.9931 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 42: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 42/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0093 - accuracy: 0.9969\n",
      "Epoch 42: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0093 - accuracy: 0.9969 - val_loss: 0.0319 - val_accuracy: 0.9944 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 43: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 43/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0108 - accuracy: 0.9969\n",
      "Epoch 43: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0108 - accuracy: 0.9969 - val_loss: 0.0523 - val_accuracy: 0.9896 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 44: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 44/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0102 - accuracy: 0.9966\n",
      "Epoch 44: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0102 - accuracy: 0.9966 - val_loss: 0.0299 - val_accuracy: 0.9927 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 45: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 45/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0092 - accuracy: 0.9972\n",
      "Epoch 45: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0092 - accuracy: 0.9972 - val_loss: 0.0319 - val_accuracy: 0.9937 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 46: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 46/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0111 - accuracy: 0.9965\n",
      "Epoch 46: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0111 - accuracy: 0.9965 - val_loss: 0.0401 - val_accuracy: 0.9900 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 47: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 47/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0075 - accuracy: 0.9976\n",
      "Epoch 47: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0075 - accuracy: 0.9976 - val_loss: 0.0377 - val_accuracy: 0.9944 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 48: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 48/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0122 - accuracy: 0.9964\n",
      "Epoch 48: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 12ms/step - loss: 0.0122 - accuracy: 0.9965 - val_loss: 0.0333 - val_accuracy: 0.9941 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 49: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 49/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0092 - accuracy: 0.9972\n",
      "Epoch 49: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0092 - accuracy: 0.9972 - val_loss: 0.0379 - val_accuracy: 0.9910 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 50: LearningRateScheduler setting learning rate to 0.000750000006519258.\n",
      "Epoch 50/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0091 - accuracy: 0.9971\n",
      "Epoch 50: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0091 - accuracy: 0.9971 - val_loss: 0.0396 - val_accuracy: 0.9902 - lr: 7.5000e-04\n",
      "\n",
      "Epoch 51: LearningRateScheduler setting learning rate to 0.0005625000048894435.\n",
      "Epoch 51/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0049 - accuracy: 0.9985\n",
      "Epoch 51: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0049 - accuracy: 0.9985 - val_loss: 0.0321 - val_accuracy: 0.9949 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 52: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 52/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0056 - accuracy: 0.9983\n",
      "Epoch 52: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0056 - accuracy: 0.9983 - val_loss: 0.0276 - val_accuracy: 0.9944 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 53: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 53/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0055 - accuracy: 0.9984\n",
      "Epoch 53: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0055 - accuracy: 0.9984 - val_loss: 0.0296 - val_accuracy: 0.9944 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 54: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 54/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0053 - accuracy: 0.9985\n",
      "Epoch 54: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0053 - accuracy: 0.9985 - val_loss: 0.0308 - val_accuracy: 0.9951 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 55: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 55/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0043 - accuracy: 0.9987\n",
      "Epoch 55: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0043 - accuracy: 0.9987 - val_loss: 0.0380 - val_accuracy: 0.9931 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 56: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 56/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0047 - accuracy: 0.9985\n",
      "Epoch 56: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0047 - accuracy: 0.9985 - val_loss: 0.0358 - val_accuracy: 0.9937 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 57: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 57/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0059 - accuracy: 0.9981\n",
      "Epoch 57: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 12ms/step - loss: 0.0059 - accuracy: 0.9981 - val_loss: 0.0310 - val_accuracy: 0.9949 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 58: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 58/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0037 - accuracy: 0.9990\n",
      "Epoch 58: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0037 - accuracy: 0.9990 - val_loss: 0.0333 - val_accuracy: 0.9954 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 59: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 59/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0047 - accuracy: 0.9987\n",
      "Epoch 59: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0047 - accuracy: 0.9987 - val_loss: 0.0338 - val_accuracy: 0.9952 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 60: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 60/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0048 - accuracy: 0.9987\n",
      "Epoch 60: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0048 - accuracy: 0.9987 - val_loss: 0.0357 - val_accuracy: 0.9954 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 61: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 61/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0044 - accuracy: 0.9988\n",
      "Epoch 61: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0044 - accuracy: 0.9988 - val_loss: 0.0460 - val_accuracy: 0.9921 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 62: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 62/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0045 - accuracy: 0.9988\n",
      "Epoch 62: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 12ms/step - loss: 0.0045 - accuracy: 0.9988 - val_loss: 0.0314 - val_accuracy: 0.9955 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 63: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 63/200\n",
      "2495/2500 [============================>.] - ETA: 0s - loss: 0.0059 - accuracy: 0.9984\n",
      "Epoch 63: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0059 - accuracy: 0.9984 - val_loss: 0.0291 - val_accuracy: 0.9952 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 64: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 64/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0052 - accuracy: 0.9986\n",
      "Epoch 64: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0052 - accuracy: 0.9987 - val_loss: 0.0359 - val_accuracy: 0.9938 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 65: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 65/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0044 - accuracy: 0.9987\n",
      "Epoch 65: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0044 - accuracy: 0.9987 - val_loss: 0.0486 - val_accuracy: 0.9928 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 66: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 66/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0054 - accuracy: 0.9983\n",
      "Epoch 66: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0054 - accuracy: 0.9983 - val_loss: 0.0376 - val_accuracy: 0.9951 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 67: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 67/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0050 - accuracy: 0.9986\n",
      "Epoch 67: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0050 - accuracy: 0.9986 - val_loss: 0.0394 - val_accuracy: 0.9943 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 68: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 68/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0050 - accuracy: 0.9985\n",
      "Epoch 68: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0050 - accuracy: 0.9985 - val_loss: 0.0336 - val_accuracy: 0.9956 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 69: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 69/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0043 - accuracy: 0.9987\n",
      "Epoch 69: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0043 - accuracy: 0.9987 - val_loss: 0.0372 - val_accuracy: 0.9939 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 70: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 70/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0057 - accuracy: 0.9984\n",
      "Epoch 70: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0056 - accuracy: 0.9984 - val_loss: 0.0366 - val_accuracy: 0.9942 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 71: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 71/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0041 - accuracy: 0.9989\n",
      "Epoch 71: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 12ms/step - loss: 0.0041 - accuracy: 0.9989 - val_loss: 0.0401 - val_accuracy: 0.9944 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 72: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 72/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0051 - accuracy: 0.9984\n",
      "Epoch 72: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0051 - accuracy: 0.9984 - val_loss: 0.0331 - val_accuracy: 0.9952 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 73: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 73/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0038 - accuracy: 0.9988\n",
      "Epoch 73: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0038 - accuracy: 0.9988 - val_loss: 0.0296 - val_accuracy: 0.9959 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 74: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 74/200\n",
      "2499/2500 [============================>.] - ETA: 0s - loss: 0.0043 - accuracy: 0.9987\n",
      "Epoch 74: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 12ms/step - loss: 0.0043 - accuracy: 0.9987 - val_loss: 0.0349 - val_accuracy: 0.9956 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 75: LearningRateScheduler setting learning rate to 0.0005624999757856131.\n",
      "Epoch 75/200\n",
      "2500/2500 [==============================] - ETA: 0s - loss: 0.0043 - accuracy: 0.9988\n",
      "Epoch 75: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0043 - accuracy: 0.9988 - val_loss: 0.0345 - val_accuracy: 0.9947 - lr: 5.6250e-04\n",
      "\n",
      "Epoch 76: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 76/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0024 - accuracy: 0.9992\n",
      "Epoch 76: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0024 - accuracy: 0.9992 - val_loss: 0.0324 - val_accuracy: 0.9963 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 77: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 77/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0025 - accuracy: 0.9993\n",
      "Epoch 77: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0025 - accuracy: 0.9993 - val_loss: 0.0330 - val_accuracy: 0.9954 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 78: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 78/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0022 - accuracy: 0.9995\n",
      "Epoch 78: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0022 - accuracy: 0.9995 - val_loss: 0.0343 - val_accuracy: 0.9955 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 79: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 79/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0031 - accuracy: 0.9992\n",
      "Epoch 79: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0032 - accuracy: 0.9992 - val_loss: 0.0394 - val_accuracy: 0.9951 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 80: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 80/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0021 - accuracy: 0.9994\n",
      "Epoch 80: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0021 - accuracy: 0.9994 - val_loss: 0.0364 - val_accuracy: 0.9961 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 81: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 81/200\n",
      "2498/2500 [============================>.] - ETA: 0s - loss: 0.0019 - accuracy: 0.9994\n",
      "Epoch 81: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0019 - accuracy: 0.9994 - val_loss: 0.0297 - val_accuracy: 0.9965 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 82: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 82/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0029 - accuracy: 0.9992\n",
      "Epoch 82: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 12ms/step - loss: 0.0029 - accuracy: 0.9992 - val_loss: 0.0330 - val_accuracy: 0.9955 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 83: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 83/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0027 - accuracy: 0.9994\n",
      "Epoch 83: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 12ms/step - loss: 0.0027 - accuracy: 0.9994 - val_loss: 0.0403 - val_accuracy: 0.9948 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 84: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 84/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0025 - accuracy: 0.9993\n",
      "Epoch 84: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 11ms/step - loss: 0.0025 - accuracy: 0.9993 - val_loss: 0.0347 - val_accuracy: 0.9962 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 85: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 85/200\n",
      "2495/2500 [============================>.] - ETA: 0s - loss: 0.0023 - accuracy: 0.9993\n",
      "Epoch 85: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0023 - accuracy: 0.9993 - val_loss: 0.0398 - val_accuracy: 0.9958 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 86: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 86/200\n",
      "2497/2500 [============================>.] - ETA: 0s - loss: 0.0028 - accuracy: 0.9991\n",
      "Epoch 86: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 29s 12ms/step - loss: 0.0028 - accuracy: 0.9991 - val_loss: 0.0392 - val_accuracy: 0.9952 - lr: 4.2187e-04\n",
      "\n",
      "Epoch 87: LearningRateScheduler setting learning rate to 0.0004218749818392098.\n",
      "Epoch 87/200\n",
      "2496/2500 [============================>.] - ETA: 0s - loss: 0.0023 - accuracy: 0.9994\n",
      "Epoch 87: val_loss did not improve from 0.02426\n",
      "2500/2500 [==============================] - 28s 11ms/step - loss: 0.0023 - accuracy: 0.9994 - val_loss: 0.0397 - val_accuracy: 0.9952 - lr: 4.2187e-04\n"
     ]
    }
   ],
   "source": [
    "cnn_history = model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=200, batch_size=32, callbacks=[lr_callback, model_checkpoint, early_stopping])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "95393cb7-9575-4646-922e-94b933ce7d11",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "685/685 [==============================] - 3s 5ms/step\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.99      0.98      0.99     18118\n",
      "           1       0.75      0.88      0.81       556\n",
      "           2       0.94      0.96      0.95      1448\n",
      "           3       0.66      0.89      0.76       162\n",
      "           4       0.99      0.99      0.99      1608\n",
      "\n",
      "    accuracy                           0.98     21892\n",
      "   macro avg       0.87      0.94      0.90     21892\n",
      "weighted avg       0.98      0.98      0.98     21892\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "# Predictions on the test set\n",
    "y_pred = model.predict(X_test)\n",
    "\n",
    "# y_test is one-hot encoded, convert it back to categorical labels\n",
    "y_true = np.argmax(y_test, axis=1)\n",
    "y_pred = np.argmax(y_pred, axis=1)\n",
    "\n",
    "# Calculate classification report\n",
    "report = classification_report(y_true, y_pred)\n",
    "\n",
    "# Print the classification report\n",
    "print(report)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ac8160bd-de55-4134-8544-4d5b14857716",
   "metadata": {},
   "source": [
    "## Transformer modeling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "57e3b8d6-4ac0-4955-bca8-c0fd4b5b3f72",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from tensorflow.keras.models import Model\n",
    "from tensorflow.keras.layers import Input, Conv1D, Activation, Add, MaxPooling1D, Flatten, Dense, Softmax, BatchNormalization\n",
    "from tensorflow.keras.optimizers import Adam\n",
    "from tensorflow.keras.losses import CategoricalCrossentropy\n",
    "from tensorflow.keras.callbacks import LearningRateScheduler, ModelCheckpoint, EarlyStopping\n",
    "from sklearn.metrics import classification_report\n",
    "from tensorflow.keras import layers\n",
    "import tensorflow.keras as keras"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "id": "3a425928-3ba3-4a2f-9630-87fa148acdd4",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], 1))\n",
    "X_test = X_test.reshape((X_test.shape[0], X_test.shape[1], 1))\n",
    "X_val = X_val.reshape((X_val.shape[0], X_val.shape[1], 1))\n",
    "n_classes=5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "id": "1abef10c-a70b-4e91-9156-f917671af2f0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(80000, 186, 1) (80000, 5)\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape, y_train.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "id": "a4fb5e87-ae24-49cc-b47a-dfc5db2e62c6",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "def transformer_encoder(inputs, head_size, num_heads, ff_dim, dropout=0):\n",
    "    # Attention and Normalization\n",
    "    x = layers.MultiHeadAttention(\n",
    "        key_dim=head_size, num_heads=num_heads, dropout=dropout\n",
    "    )(inputs, inputs)\n",
    "    x = layers.Dropout(dropout)(x)\n",
    "    x = layers.LayerNormalization(epsilon=1e-6)(x)\n",
    "    res = x + inputs\n",
    "\n",
    "    # Feed Forward Part\n",
    "    x = layers.Conv1D(filters=ff_dim, kernel_size=1, activation=\"relu\")(res)\n",
    "    x = layers.Dropout(dropout)(x)\n",
    "    x = layers.Conv1D(filters=inputs.shape[-1], kernel_size=1)(x)\n",
    "    x = layers.LayerNormalization(epsilon=1e-6)(x)\n",
    "    return x + res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "id": "11873f29-bd74-41bc-b4ff-051131973780",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "def build_model(\n",
    "    input_shape,\n",
    "    head_size,\n",
    "    num_heads,\n",
    "    ff_dim,\n",
    "    num_transformer_blocks,\n",
    "    mlp_units,\n",
    "    dropout=0,\n",
    "    mlp_dropout=0,\n",
    "):\n",
    "    inputs = keras.Input(shape=input_shape)\n",
    "    x = inputs\n",
    "    for _ in range(num_transformer_blocks):\n",
    "        x = transformer_encoder(x, head_size, num_heads, ff_dim, dropout)\n",
    "\n",
    "    x = layers.GlobalAveragePooling1D(data_format=\"channels_last\")(x)\n",
    "    for dim in mlp_units:\n",
    "        x = layers.Dense(dim, activation=\"relu\")(x)\n",
    "        x = layers.Dropout(mlp_dropout)(x)\n",
    "    outputs = layers.Dense(n_classes, activation=\"softmax\")(x)\n",
    "    return keras.Model(inputs, outputs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "id": "c56b160f-05e0-4d5d-a082-860bbad4a5c4",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "input_shape = X_train.shape[1:]\n",
    "\n",
    "model = build_model(\n",
    "    input_shape,\n",
    "    head_size=256,\n",
    "    num_heads=4,\n",
    "    ff_dim=4,\n",
    "    num_transformer_blocks=4,\n",
    "    mlp_units=[128],\n",
    "    mlp_dropout=0.4,\n",
    "    dropout=0.25,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "id": "c296846a-264c-4ee8-9b70-e4935fa2a3e3",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model_5\"\n",
      "__________________________________________________________________________________________________\n",
      " Layer (type)                Output Shape                 Param #   Connected to                  \n",
      "==================================================================================================\n",
      " input_20 (InputLayer)       [(None, 186, 1)]             0         []                            \n",
      "                                                                                                  \n",
      " multi_head_attention_27 (M  (None, 186, 1)               7169      ['input_20[0][0]',            \n",
      " ultiHeadAttention)                                                  'input_20[0][0]']            \n",
      "                                                                                                  \n",
      " dropout_56 (Dropout)        (None, 186, 1)               0         ['multi_head_attention_27[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " layer_normalization_46 (La  (None, 186, 1)               2         ['dropout_56[0][0]']          \n",
      " yerNormalization)                                                                                \n",
      "                                                                                                  \n",
      " tf.__operators__.add_42 (T  (None, 186, 1)               0         ['layer_normalization_46[0][0]\n",
      " FOpLambda)                                                         ',                            \n",
      "                                                                     'input_20[0][0]']            \n",
      "                                                                                                  \n",
      " conv1d_63 (Conv1D)          (None, 186, 4)               8         ['tf.__operators__.add_42[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " dropout_57 (Dropout)        (None, 186, 4)               0         ['conv1d_63[0][0]']           \n",
      "                                                                                                  \n",
      " conv1d_64 (Conv1D)          (None, 186, 1)               5         ['dropout_57[0][0]']          \n",
      "                                                                                                  \n",
      " layer_normalization_47 (La  (None, 186, 1)               2         ['conv1d_64[0][0]']           \n",
      " yerNormalization)                                                                                \n",
      "                                                                                                  \n",
      " tf.__operators__.add_43 (T  (None, 186, 1)               0         ['layer_normalization_47[0][0]\n",
      " FOpLambda)                                                         ',                            \n",
      "                                                                     'tf.__operators__.add_42[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " multi_head_attention_28 (M  (None, 186, 1)               7169      ['tf.__operators__.add_43[0][0\n",
      " ultiHeadAttention)                                                 ]',                           \n",
      "                                                                     'tf.__operators__.add_43[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " dropout_58 (Dropout)        (None, 186, 1)               0         ['multi_head_attention_28[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " layer_normalization_48 (La  (None, 186, 1)               2         ['dropout_58[0][0]']          \n",
      " yerNormalization)                                                                                \n",
      "                                                                                                  \n",
      " tf.__operators__.add_44 (T  (None, 186, 1)               0         ['layer_normalization_48[0][0]\n",
      " FOpLambda)                                                         ',                            \n",
      "                                                                     'tf.__operators__.add_43[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " conv1d_65 (Conv1D)          (None, 186, 4)               8         ['tf.__operators__.add_44[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " dropout_59 (Dropout)        (None, 186, 4)               0         ['conv1d_65[0][0]']           \n",
      "                                                                                                  \n",
      " conv1d_66 (Conv1D)          (None, 186, 1)               5         ['dropout_59[0][0]']          \n",
      "                                                                                                  \n",
      " layer_normalization_49 (La  (None, 186, 1)               2         ['conv1d_66[0][0]']           \n",
      " yerNormalization)                                                                                \n",
      "                                                                                                  \n",
      " tf.__operators__.add_45 (T  (None, 186, 1)               0         ['layer_normalization_49[0][0]\n",
      " FOpLambda)                                                         ',                            \n",
      "                                                                     'tf.__operators__.add_44[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " multi_head_attention_29 (M  (None, 186, 1)               7169      ['tf.__operators__.add_45[0][0\n",
      " ultiHeadAttention)                                                 ]',                           \n",
      "                                                                     'tf.__operators__.add_45[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " dropout_60 (Dropout)        (None, 186, 1)               0         ['multi_head_attention_29[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " layer_normalization_50 (La  (None, 186, 1)               2         ['dropout_60[0][0]']          \n",
      " yerNormalization)                                                                                \n",
      "                                                                                                  \n",
      " tf.__operators__.add_46 (T  (None, 186, 1)               0         ['layer_normalization_50[0][0]\n",
      " FOpLambda)                                                         ',                            \n",
      "                                                                     'tf.__operators__.add_45[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " conv1d_67 (Conv1D)          (None, 186, 4)               8         ['tf.__operators__.add_46[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " dropout_61 (Dropout)        (None, 186, 4)               0         ['conv1d_67[0][0]']           \n",
      "                                                                                                  \n",
      " conv1d_68 (Conv1D)          (None, 186, 1)               5         ['dropout_61[0][0]']          \n",
      "                                                                                                  \n",
      " layer_normalization_51 (La  (None, 186, 1)               2         ['conv1d_68[0][0]']           \n",
      " yerNormalization)                                                                                \n",
      "                                                                                                  \n",
      " tf.__operators__.add_47 (T  (None, 186, 1)               0         ['layer_normalization_51[0][0]\n",
      " FOpLambda)                                                         ',                            \n",
      "                                                                     'tf.__operators__.add_46[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " multi_head_attention_30 (M  (None, 186, 1)               7169      ['tf.__operators__.add_47[0][0\n",
      " ultiHeadAttention)                                                 ]',                           \n",
      "                                                                     'tf.__operators__.add_47[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " dropout_62 (Dropout)        (None, 186, 1)               0         ['multi_head_attention_30[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " layer_normalization_52 (La  (None, 186, 1)               2         ['dropout_62[0][0]']          \n",
      " yerNormalization)                                                                                \n",
      "                                                                                                  \n",
      " tf.__operators__.add_48 (T  (None, 186, 1)               0         ['layer_normalization_52[0][0]\n",
      " FOpLambda)                                                         ',                            \n",
      "                                                                     'tf.__operators__.add_47[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " conv1d_69 (Conv1D)          (None, 186, 4)               8         ['tf.__operators__.add_48[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " dropout_63 (Dropout)        (None, 186, 4)               0         ['conv1d_69[0][0]']           \n",
      "                                                                                                  \n",
      " conv1d_70 (Conv1D)          (None, 186, 1)               5         ['dropout_63[0][0]']          \n",
      "                                                                                                  \n",
      " layer_normalization_53 (La  (None, 186, 1)               2         ['conv1d_70[0][0]']           \n",
      " yerNormalization)                                                                                \n",
      "                                                                                                  \n",
      " tf.__operators__.add_49 (T  (None, 186, 1)               0         ['layer_normalization_53[0][0]\n",
      " FOpLambda)                                                         ',                            \n",
      "                                                                     'tf.__operators__.add_48[0][0\n",
      "                                                                    ]']                           \n",
      "                                                                                                  \n",
      " global_average_pooling1d_5  (None, 1)                    0         ['tf.__operators__.add_49[0][0\n",
      "  (GlobalAveragePooling1D)                                          ]']                           \n",
      "                                                                                                  \n",
      " dense_13 (Dense)            (None, 128)                  256       ['global_average_pooling1d_5[0\n",
      "                                                                    ][0]']                        \n",
      "                                                                                                  \n",
      " dropout_64 (Dropout)        (None, 128)                  0         ['dense_13[0][0]']            \n",
      "                                                                                                  \n",
      " dense_14 (Dense)            (None, 5)                    645       ['dropout_64[0][0]']          \n",
      "                                                                                                  \n",
      "==================================================================================================\n",
      "Total params: 29645 (115.80 KB)\n",
      "Trainable params: 29645 (115.80 KB)\n",
      "Non-trainable params: 0 (0.00 Byte)\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.compile(\n",
    "    loss='categorical_crossentropy',\n",
    "    optimizer=keras.optimizers.Adam(learning_rate=0.001),\n",
    "    metrics=['accuracy']\n",
    ")\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "id": "7c37732c-bc94-4a32-b39a-9243f75f8434",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "1250/1250 [==============================] - 2566s 2s/step - loss: 1.4424 - accuracy: 0.3694 - val_loss: 1.4033 - val_accuracy: 0.3813\n",
      "Epoch 2/10\n",
      "1250/1250 [==============================] - 2515s 2s/step - loss: 1.3882 - accuracy: 0.3875 - val_loss: 1.3804 - val_accuracy: 0.3855\n",
      "Epoch 3/10\n",
      "1250/1250 [==============================] - 2528s 2s/step - loss: 1.3751 - accuracy: 0.3899 - val_loss: 1.3701 - val_accuracy: 0.4017\n",
      "Epoch 4/10\n",
      "1250/1250 [==============================] - 2529s 2s/step - loss: 1.3652 - accuracy: 0.3999 - val_loss: 1.3631 - val_accuracy: 0.4042\n",
      "Epoch 5/10\n",
      "1250/1250 [==============================] - 2520s 2s/step - loss: 1.3588 - accuracy: 0.4020 - val_loss: 1.3510 - val_accuracy: 0.4069\n",
      "Epoch 6/10\n",
      "1250/1250 [==============================] - 2517s 2s/step - loss: 1.3536 - accuracy: 0.4011 - val_loss: 1.3462 - val_accuracy: 0.4045\n",
      "Epoch 7/10\n",
      "1250/1250 [==============================] - 2518s 2s/step - loss: 1.3479 - accuracy: 0.4031 - val_loss: 1.3389 - val_accuracy: 0.4048\n",
      "Epoch 8/10\n",
      "1250/1250 [==============================] - 2516s 2s/step - loss: 1.3450 - accuracy: 0.4023 - val_loss: 1.3370 - val_accuracy: 0.4035\n",
      "Epoch 9/10\n",
      "1250/1250 [==============================] - 2516s 2s/step - loss: 1.3428 - accuracy: 0.4030 - val_loss: 1.3357 - val_accuracy: 0.4031\n",
      "Epoch 10/10\n",
      "1250/1250 [==============================] - 2515s 2s/step - loss: 1.3409 - accuracy: 0.4049 - val_loss: 1.3320 - val_accuracy: 0.4015\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.src.callbacks.History at 0x23ccd79d790>"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "callbacks = [keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True)]\n",
    "model.fit(\n",
    "    X_train,\n",
    "    y_train,\n",
    "    validation_data=(X_val, y_val),\n",
    "    epochs=10,\n",
    "    batch_size = 64,\n",
    "    callbacks=callbacks,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f1cab1a-9953-4802-b85e-d9f4e516b29a",
   "metadata": {},
   "source": [
    "i will be running it in my own time, and optimizing it more, because i really want to know how it would turn out ^^"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "id": "652dc7b1-18e5-452a-a005-159345049daa",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "685/685 [==============================] - 263s 384ms/step\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.87      0.04      0.08     18118\n",
      "           1       0.00      0.00      0.00       556\n",
      "           2       0.09      0.56      0.16      1448\n",
      "           3       0.02      0.85      0.03       162\n",
      "           4       0.24      0.51      0.33      1608\n",
      "\n",
      "    accuracy                           0.12     21892\n",
      "   macro avg       0.24      0.39      0.12     21892\n",
      "weighted avg       0.75      0.12      0.10     21892\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Carrene\\anaconda3\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1469: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "C:\\Users\\Carrene\\anaconda3\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1469: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "C:\\Users\\Carrene\\anaconda3\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1469: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n"
     ]
    }
   ],
   "source": [
    "# Predictions on the test set\n",
    "y_test_pred = model.predict(X_test)\n",
    "\n",
    "# Convert predictions to categorical labels\n",
    "y_test_true = np.argmax(y_test.values, axis=1)\n",
    "y_test_pred = np.argmax(y_test_pred, axis=1)\n",
    "\n",
    "# Calculate classification report\n",
    "report = classification_report(y_test_true, y_test_pred)\n",
    "print(report)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a8f94542-b483-407d-8711-7e90109571c9",
   "metadata": {},
   "source": [
    "the accuracies of this transformer model show a global decrease vs the CNN model previously introduced but we need to assess that the CNN model was the built model for this task in the article ^^"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "62ce2067-b824-4bf4-836e-6b76d36cb971",
   "metadata": {},
   "source": [
    "Thank you for this and prior courses, they were very inspiring.<3\n",
    "With Best Regards,\n",
    "Carrene Kakuee"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
